一. 代表
因为一些编程语言中可以用函数指针来进行访问,所以代表(delegates)使得这一特定情况变得可能。与函数指针不同,代表是面向对象的,类型安全并且是可靠的。
代表是引用类型,它从公共基类:System.Delegate派生出来。
一个代表实例压缩了一个方法——一个可调用的实体。对于静态方法,一个可调用实体由类和类中的静态方法组成。
代表的一个有趣而且有用的特性是它不知道或者不关心与它相关的对象的类型。对象所要做的所有事情是方法的签名和代表的签名相匹配。这使得代表很适合“匿名”调用。这是个很有用的功能。
定义和使用代表分为三步:声明、实例化和调用。
用 delegate声明语法来声明代表。
例子:
delegate void SimpleDelegate();
声明了一个名为 SimpleDelegate的代表,它没有任何参数并且返回 void值。
例子:
class Test
{
static void F()
{
System.Console.WriteLine("Test.F");
}
static void Main()
{
SimpleDelegate d = new SimpleDelegate(F);
d();
}
}
创建了一个 SimpleDelegate实例,并且马上就对它进行调用。
对于为一个方法实例化一个代表并且马上调用它没有什么好说的,理由是它会比直接调用方法要简单得 多。代表在匿名使用时会显示它的用处。
例子:
void MultiCall(SimpleDelegate d, int count)
{
for (int i = 0; i < count; i++)
{
d();
}
}
介绍了一个方法 MultiCall,它重复调用 SimpleDelegate。方法 MultiCall并不知道或这关心哪种类型方法是 SimpleDelegate的目标方法,这种方法有什么样的可达性,或这些方法是静态的还是非静态的。所有关心的事情是目标方法的签名是否与一致。
二. 联合
联合类型的声明为一个符号常数相关的组定义了一个类型名称。联合应用于“多选择”的场合,这里运 行时间是由在编译时所知道的固定的选择数目所决定。
例子:
enum Color
{
Red,
Blue,
Green
}
class Shape
{
public void Fill(Color color)
{
switch (color)
{
case Color.Red:
...
break;
case Color.Blue:
...
break;
case Color.Green:
...
break;
default: break;
}
}
}
介绍了一个联合 color和一个使用这个联合的方法。方法 Fill的名称使人很容易明白形状可以用所给的 颜色中的一种进行填充。
因为使用联合可以使得代码更可读还可以自归档,所以使用联合比使用整数常数要好-当然,很多语言中通常没有联合。代码的自归档特点也使得开发工具可以帮助编写代码的和进行一些其它的“设计者” 行为。例如,使用 Color而不是 int作为参数类型,使得精确代码编辑器可以给出 Color的数值。