.net 中匿名方法 与 委托
2015-04-23 14:19
302 查看
匿名方法,顾名思义,他是一个方法,但是是一个没有名字的方法。但是如何区分 匿名方法和非匿名方法的呢?
答案就是 delegate 关键字.
举例:
非匿名方法:
匿名方法:
那我们可能会问,没名字怎么用呀?
在.net 中一切皆以对象存在,我们只需要将匿名方法赋值给一个变量,即可通过这个变量来引用它了。
委托:是.net中对方法的一种安全引用。
通常我们是请求类/或者是对象的成员——即要调用的方法。
除此之外.net还可以通过委托的机制来引用方法, 因为.net 中具体相同的方法签名的方法,被认为是同一种类型/(or 委托),所以委托也是一种类型,就像 class,enum,struct一样,他是专门用来描述方法的一种类型。
我们通过 delegate 来声明一个委托类型,就像我们用class 来声明一个类一样,同时我们声明出来的这个类型是从Delegate继承来的,所以说所有的委托类型也都同时是Delegate,就像所有struct 类型都是ValueType一样。
那么如果创建一个自定义委托类型的实例呢,很简单,用new 关键字。 就像你new struct一样。
c# 支持更简化的语法
如果每个开发人员都定义这样的委托,就会到处都是委托的定义,尽管方法签名一样,但是他们的类型却不一样,需要强制转换,很不方便。
于是.Net为开发者内置了几个重要的委托供大家使用,基本上不需要开发者自定义。
他们是Action,Action的泛型版本,Func,Func的泛型版本,Predicate,Predicate的泛型版本。
再说说lamada表达式,其实无论是匿名方法还是lamada表达式,都是提供一种在方法inline方法的机制。
C# 简化了匿名方法的写法,用lamada表达式 替换匿名方法
匿名方法:
lamada表达式:
=> 左边的是参数列表,后边是方法体。 lamada表达式还有几种简化的写法,这里不一一列举。
答案就是 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表达式还有几种简化的写法,这里不一一列举。
相关文章推荐
- 从.NET中委托写法的演变谈开去(上):委托与匿名方法(转)
- .net基础扫盲-小例子串委托、匿名方法、lambda表达式
- .net学习之新语法学习(匿名类和匿名方法,扩展方法,系统内置委托,Lambda表达式和linq等)
- 一起谈.NET技术,C#中的委托,匿名方法和Lambda表达式
- 从.NET中委托写法的演变谈开去(上):委托与匿名方法
- 一起谈.NET技术,从.NET中委托写法的演变谈开去(上):委托与匿名方法
- 从.NET中委托写法的演变谈开去(上):委托与匿名方法
- 从.NET中委托写法的演变谈开去(上):委托与匿名方法
- C#控制台基础 返回类型为void的无参数委托与匿名方法
- C#中的委托,匿名方法、泛型委托和Lambda表达式表达式演变过程
- 委托调用匿名方法
- 委托,lambda,匿名方法
- c# 匿名方法(委托)
- 通过Func 委托理解委托和匿名方法及Lambda 表达式
- 转帖:用五分钟重温委托,匿名方法,Lambda,泛型委托,表达式树
- .NET中的Lambda表达式与匿名方法
- (第三季)委托(201~204)207 多播委托 208 匿名方法
- 用五分钟重温委托,匿名方法,Lambda,泛型委托,表达式树
- 带有命名方法的委托与带有匿名方法的委托
- C#匿名委托和匿名方法使用小技巧