方法 Show1 被调用,两个实参相加的值是:23
方法 Show1 被调用,两个实参相加的值是:67
方法 Show1 被调用,两个实参相加的值是:133
方法 Show1 被调用,两个实参相加的值是:445
方法 Show1 被调用,两个实参相加的值是:67
方法 Show1 被调用,两个实参相加的值是:89
方法 Show1 被调用,两个实参相加的值是:155
因为 D 和 D2 的访问权限被定义成了 protected 和 protected internal。所以下面来验证在其它程序集中是否可以访问它们。首先要将本段代码中的包含 Main 方法的类去掉,然后在它的项目属性中将它改变为类库。接下来新建一个控制台项目,并物理上引用这个类库。控制台项目的代码如下:
using System;
using LycheeTest;
namespace LycheeTest1{
class Program: Test {
private D pD;
private D2 pD2;
public Program() {
pD = new D(Show1);
pD2 = new D2(Show1);
}
public void Use3() {
pD(34, 33);
pD2(12, 11);
}
static void Main(string[] args) {
Program p = new Program();
p.Use3();
Console.ReadKey();
}
}
}
因为第 3 行代码的命名空间和类库的命名空间是两个独立的命名空间,它们的成员不位于同一个命名空间内。所以在一个命名空间内引用另一个命名空间的成员时,需要加上另一个命名空间的名称进行引用。 为了代码编写的方便,第 2 行代码首先引用了类库的命名空间。第 4 行代码定义了一个类,它继承自基类 Test。因为是派生类,所以对于委托类型 D 和 D2 都可以访 问。第 5 行代码和第 6 行代码分别定义了 D 和 D2 的两个变量。第 7 行的实例构造方法对这两个变量进行了实例化,并为其传入方法 Show1。因为 Show1 方法被继承了下来,所以这里不需要类名引用。第 11 行代码定义了一个实例方法,它的作用是调用这两个委托,并为其传入实参。第 16 行代码定义了本类的一个实例,并调用了实例方法 Use3。这段代码的执行结果如下:
方法 Show1 被调用,两个实参相加的值是:67
方法 Show1 被调用,两个实参相加的值是:23
类Test中的委托类型D2和D3都具有internal权限,现在来验证一下,对于一个同一程序集中的非派生类是否可以访问它们。首先将类库更改回控制台项目,然后增加一个类,这个类对于Test类来说是独立的。它们之间只是位于一个程序集内,彼此没有继承关系。代码如下:
using System;
namespace LycheeTest {
public class Test {
protected delegate void D(int a, int b);
private delegate void D1(int a, int b);
protected internal delegate void D2(int a, int b);
internal delegate void D3(int a, int b);
private D myD;
private D1 myD1;
private D2 myD2;
private D3 myD3;
public Test() {
myD = new D(Show1);
myD1 = new D1(Show1);
myD2 = new D2(Show1);
myD3 = new D3(Show1);
}
public static void Show1(int a, int b) {
Console.WriteLine("方法 Show1 被调用,两个实参相加的值是:{0}", a + b);
}
public void Show2(int a, int b) {
Console.WriteLine("方法 Show2 被调用,两个实参相加的值是:{0}", a + b);
}
public void Show3(int a, int b) {
Console.WriteLine("方法 Show3 被调用,两个实参相加的值是:{0}", a + b);
}
public void Use() {
myD(11, 12);
myD1(22, 45);
myD2(55, 78);
myD3(345, 100);
}
}
class Test1 {
private Test.D2 tD2;
private Test.D3 tD3;
public Test1() {
tD2 = new Test.D2(Test.Show1);
tD3 = new Test.D3(Test.Show1);
}
public void Use3() {
tD2(34, 33);
tD3(22, 21);
}
}
public class Program {
static void Main(string[] args) {
Test1 myT1 = new Test1();
myT1.Use3();
Console.ReadKey();
}
}
}










