.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表达式还有几种简化的写法,这里不一一列举。
浙公网安备 33010602011771号