您的位置:首页 > 其它

.net 中匿名方法 与 委托

2015-04-23 14:19 302 查看
匿名方法,顾名思义,他是一个方法,但是是一个没有名字的方法。但是如何区分 匿名方法和非匿名方法的呢?

答案就是 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表达式还有几种简化的写法,这里不一一列举。

 

  

  

  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: