.net 中匿名方法 与 委托

匿名方法,顾名思义,他是一个方法,但是是一个没有名字的方法。但是如何区分 匿名方法和非匿名方法的呢?

答案就是 delegate 关键字.

举例:

非匿名方法:

private void FunctionName (/*parameters list*/)
{
  // Function body
}

  

匿名方法:

delegate (/*parameters list*/)
{
  // Function body
}

那我们可能会问,没名字怎么用呀?

在.net 中一切皆以对象存在,我们只需要将匿名方法赋值给一个变量,即可通过这个变量来引用它了。

var functionName = delegate (/*parameters list*/)
{
  // Function body
};

// call it.
functionName();

 

委托:是.net中对方法的一种安全引用。

通常我们是请求类/或者是对象的成员——即要调用的方法。

除此之外.net还可以通过委托的机制来引用方法, 因为.net 中具体相同的方法签名的方法,被认为是同一种类型/(or 委托),所以委托也是一种类型,就像 class,enum,struct一样,他是专门用来描述方法的一种类型。

我们通过 delegate 来声明一个委托类型,就像我们用class 来声明一个类一样,同时我们声明出来的这个类型是从Delegate继承来的,所以说所有的委托类型也都同时是Delegate,就像所有struct 类型都是ValueType一样。

那么如果创建一个自定义委托类型的实例呢,很简单,用new 关键字。 就像你new struct一样。

delegate int DelegateA();
DelegateA a = new DelegateA(A_Function_NoParameter_ReturnInt);

c# 支持更简化的语法

DelegateA a = A_Function_NoParameter_ReturnInt;

 

如果每个开发人员都定义这样的委托,就会到处都是委托的定义,尽管方法签名一样,但是他们的类型却不一样,需要强制转换,很不方便。

于是.Net为开发者内置了几个重要的委托供大家使用,基本上不需要开发者自定义。

他们是Action,Action的泛型版本,Func,Func的泛型版本,Predicate,Predicate的泛型版本。

 

再说说lamada表达式,其实无论是匿名方法还是lamada表达式,都是提供一种在方法inline方法的机制。

C# 简化了匿名方法的写法,用lamada表达式 替换匿名方法

匿名方法:

Action<int> function1 = delegate (int i)
{
  // Function body
};

lamada表达式:

Action<int> function1 = (int i) =>
{
  // Function body
};

=> 左边的是参数列表,后边是方法体。 lamada表达式还有几种简化的写法,这里不一一列举。

 

 

  

  

  

 

posted @ 2015-04-23 14:19  sylvester.lee  阅读(1432)  评论(1)    收藏  举报