1. 委托是类型,与类一样,委托类型必须在被用来创建变量以及类型的对象之前声明。
delegate void MyDel(int x); //声明委托类型
MyDel delVar1,delVar2; //创建两个委托变量
delVar1=new MyDel(myInstObj.MyM1); //创建委托并保存引用
delVar2=myInstObj.MyM1; //创建委托并保存引用
2. 委托是引用类型,我们可以通过给它赋值来改变在委托变量中的引用。旧的委托对象会被垃圾回收器回收。
MyDel delVar=myInstObj.MyM1; //Create and assign the delete object
delVar=SClass.OtherM2; //Create and assign the new delete object
3. 组合委托(combining delegate)。委托可以使用运算符“+”来组合,这个运算最终会创建一个新的委托,其调用列表是两个操作数的委托调用列表的副本的连接。
4. 可以通过使用“+=”运算符来为委托增加方法或另一个委托,使用“-=”运算符从委托移除方法。
5. 可以像调用方法一样简单地调用委托。用于调用委托的参数将会用于调用调用列表中的每一个方法(除非有一个参数是输出参数)。
6. 委托示例:
delegate void PrintFunction();
class Test
{
public void Print1()
{ Console.WriteLine("Print1--instance"); }
public static void Print2()
{ Console.WriteLine("Print2--static"); }
}
class Program
{
static void Main(string[] args)
{
Test t = new Test();
PrintFunction pf;
pf = t.Print1;
pf += Test.Print2;
pf += t.Print1;
pf += Test.Print2;
if (null != pf)
pf();
else
Console.WriteLine("Delegate is empty");
}
}
7. 如果委托有返回值并且在调用列表中有一个以上的方法,会发生下面的情况:调用列表中最后一个方法返回的值就是委托调用返回的值;调用列表中所有其他方法的返回值都会被忽略。
8. 如果委托有引用参数,参数值会根据调用列表中的一个或多个方法的返回值而改变。在调用委托列表中的下一个方法时,参数的新值(不是初始值)会传给下一个方法。
9. 匿名方法(anonymous method)是在初始化委托时内联(inline)声明的方法。
delegate void OtherDel(int InParam);
OtherDel del = delegate(int x) { return x + 20; };
10. Lambda表达式。C#3.0引入了Lambda表达式,简化了匿名方法的语法,从而避免了包含多余的信息。我们可以通过以下步骤把匿名方法转换为Lambda表达式:
- 删除delegate关键字
- 在参数列表和匿名方法主体之间放Lambda运算符=>。Lambda运算符读作“goes to”。
delegate int OtherDel(int InParam);
OtherDel del = delegate(int x) { return x + 20; }; //匿名方法
OtherDel le1 = (int x) => { return x + 20; };
OtherDel le2 = (x) => { return x + 20; };
OtherDel le3 = x => { return x + 20; };
OtherDel le4 = x => x + 20;

浙公网安备 33010602011771号