spf2011

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::

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;
摘自:《C#图解教程》—《Illustrated C# 2008》,Daniel Solis 著, 苏林 朱晔等译
posted on 2011-04-02 10:29  spf2011  阅读(113)  评论(0)    收藏  举报