标签:
因为定义委托基本上是定义一个新类,所以可以在定义类的任何相同地方定义委托,也就是说,可以在另一个类的内部定义,也可以在任何类的外部定义,还可以在名称空间中把委托定义为顶层对象。根据定义的可见性,和委托的作用域,可以在委托的定义上应用任意常见的访问修饰符:public、private、protected等:
实际上,“定义一个委托”是指“定义一个新类”。委托实现为派生自基类System.MulticastDelegate的类,System.MulticastDelegate又派生自基Syetem.Delegate。c#编译器能识别这个类,会使用其委托语法,因此我们不需要了解这个类的具休执行情况。这是c#与基类共同合作,使编程更易完成的一个范例。
构造函数:
在C#中,委托在语法上总是接受一个参数的构造函数,这个参数就是委托引用的方法。这个方法必须匹配最初定义委托时的签名。给定委托的实例可以引用任何类型的任何对象的实例方法或静态方法---只要方法签名匹配于委托的签名即可。
private delegate string GetAString();
int x=40;
GetAstring firststringMethod = new GetAstring(x.Tostring);
或
GetAstring firststringMethod = x.Tostring;
注意:
1.因为int.Tostring()是一个实例方法(不是静态方法),所以需要指定实例(x)和方法名来正确地初始化委托。(int x = 40;和声明对象差不多,只不过等号右边不是使用的new)
2.调用上述方法名时输入形式不能为x.ToString()(不要输入圆括号),也不能把它传送给委托变量。输入圆括号代表调用一个方法。调用x.ToString()方法会返回一个不能赋予委托变量的字符串对象。只能把方法的地址赋予委托变量
通过委托调用方法:委托名字后面加圆括号的方式,圆括号中应包含调用该委托中的方法时使用的任何等效参数
firstStringMethod();
实际上,使用委托实例+圆括号的方式与调用委托类的Invoke()方法完全相同。因为firstStringMethod是委托类型的一个变量,所以C#编译器会用firstStringMethod.Invoke();代替firstStringMethod();
firstStringMethod.Invoke();
委托推断:
为了减少输入量,只要需要委托实例,就可以只传送地址的名称。这称为委托推断。
委托数组:
delegate double DoubleOp(double x);
Double0p[] operations =
{
//MultiplyByTwo为MathsOperations类中的一个静态方法(*2)
Math0perations.MultiplyByTwo,
//Square为MathsOperations类中的一个静态方法(平方)
Mathoperations.Square
};
该数组的每个元素都初始化为由MathsOperations类实现的不同操作。然后遍历这个数组,把每个操作应用到
\ 3个不同的值上。这说明了使用委托的一种方式——把方法组合到一个数组中来使用,这样就可以
在循环中调用不同的方法了。
这段代码的关键一行是把每个委托传递给PrOces跛mⅡsplayNmberO方法,例如
匿名方法:
到目前为止,要想使委托工作,方法必须己经存在(即委托是用它将调用的方法的相同签名定义的)。但还有另外一种使用委托的方式:即通过匿名方法。匿名方法是用作委托的参数的一段代码。用匿名方法定义委托的语法与前面的定义并没有区别。但在实例化委托时,就有区别了。下面是一个非常简单的控制台应用程序,它说明了如何使用匿名方法:
using system;
namespace Wrox.ProCSharp。Delegates
(
class Program
(
static void Main()
{string mid = ", midd1e part,";
FunC(string、 string>anonDel = delegate(string param)
{
param += mid;
param += " and this Was added to the string.";
return param;
}
Conso1e。WriteLine(anonDel ("start of string"));
}}}
标签:
原文地址:http://www.cnblogs.com/mrxiaohe/p/5593265.html