C#==>匿名方法 【转】
http://blog.csdn.net/gishero/article/details/5161826
1,匿名方法
C#为委托提供一种机制,可以为委托定义匿名方法,匿名方法没有名称,编译器会定指定一个名称
匿名方法中不能使用跳转语句跳转到该匿名方法的外部,也不能跳转到该方法的内部。
也不能在匿名方法外部使用的ref和out参数
- //用匿名方法定义委托
- class Program
- {
- delegate string MyDelagate(string val);
- static void Main(string[] args)
- {
- string str1 = " 匿名方法外部 ";
- //中括号部分定义来了一个方法,没有名称,编译器会定指定一个名称
- MyDelagate my = delegate(string param)
- {
- string str2 = " 匿名方法内部 ";
- return param + str1 + str2;
- };
- //调用委托的匿名方法
- Console.WriteLine(my(" 参数 "));
- //从结果可以看到,匿名方法同样达到了为委托定义方法的效果
- Console.Read();
- }
- }
2,匿名方法的【λ(拉姆达)表达式】方式定义
C#3.0之后匿名方法可以使用λ表达式来进行定义
无论是拉姆达(lambda)表达式(事实上应该叫匿名函数)或是匿名类,都能归属到一种叫闭包的东西上面。
λ运算符 =>
左边是参数,使用括号表达 (string param),可以是 (param)这样不定义类型,编译器会推断出来,只有一个参数的时候可以不使用括号
右边是实现代码,使用花括号,如果代码只有一行,则不使用花括号和return关键字也可以,编译器会为我们添加
这是λ表达式的简单实现
string str1 = " 匿名方法外部 ";
string str2 = " 匿名方法内部 ";
MyDelagate my = param => param + str1 + str2;
Console.WriteLine(my(" 参数 "));
3,委托调用过程的协变和抗变
关于委托的返回类型和委托方法的参数传递,如果我们不能正确使用的时候,经常会发生“协变和抗变”的错误。
需要额外注意
返回类型:返回类型需要注意的是协变
方法的返回类型可以派生于委托定义的类型。
参数类型:参数类型需要注意的是抗变
向委托传递的参数类型可以派生于委托方法的参数类型
返回类型的协变
- public class A { }
- //B继承自A
- public class B : A { }
- class Program
- {
- //委托的返回类型是A
- public delegate A MyDelegate();
- static void Main(string[] args)
- {
- //向委托添加方法Method
- MyDelegate my = Method;
- //方法Method的返回类型可以派生于委托定义的返回类型,这就是协变
- my();
- //※,如果将委托的返回类型,和Method方法的返回类型互换,就会产生编译错误
- }
- //方法返回一个子类B的类型,B继承自A
- static B Method()
- {
- return new B();
- }
- }
参数类型的抗变
- public class A { }
- //B继承自A
- public class B : A { }
- class Program
- {
- //委托的返回类型是A
- public delegate void MyDelegate(B b);
- static void Main(string[] args)
- {
- //向委托添加方法Method
- MyDelegate my = Method;
- //向委托传递的参数的类型可以派生于委托方法的参数类型,这就是抗变
- my(new B());
- //※,如果将委托的参数的类型,和Method方法的参数的类型互换,就会产生编译错误
- }
- //方法返回一个子类B的类型,B继承自A
- static void Method(A a) { }
- }
//实际上继承自A的类型B的实例可以转化为A,而子类向父类转化的过程,在默认情况下会有编译错误
//如下代码
A aa = new A();
B bb = new B();
//这句没问题
aa = bb;
//子类向父类转化的过程中存在问题
bb = aa;
以上协变和抗变都是由这个原因产生的
C#==>匿名方法 【转】的更多相关文章
- [C#] C# 基础回顾 - 匿名方法
C# 基础回顾 - 匿名方法 目录 简介 匿名方法的参数使用范围 委托示例 简介 在 C# 2.0 之前的版本中,我们创建委托的唯一形式 -- 命名方法. 而 C# 2.0 -- 引进了匿名方法,在 ...
- 用五分钟重温委托,匿名方法,Lambda,泛型委托,表达式树
这些对老一代的程序员都是老生常谈的东西,没什么新意,对新生代的程序员却充满着魅力.曾经新生代,好多都经过漫长的学习,理解,实践才能掌握委托,表达式树这些应用.今天我尝试用简单的方法叙述一下,让大家在五 ...
- 匹夫细说C#:委托的简化语法,聊聊匿名方法和闭包
0x00 前言 通过上一篇博客<匹夫细说C#:庖丁解牛聊委托,那些编译器藏的和U3D给的>的内容,我们实现了使用委托来构建我们自己的消息系统的过程.但是在日常的开发中,仍然有很多开发者因为 ...
- 从匿名方法到 Lambda 表达式的推演过程
Lambda 表达式是一种可用于创建委托或表达式目录树类型的匿名函数. 通过使用 lambda 表达式,可以写入可作为参数传递或作为函数调用值返回的本地函数. 以上是msdn官网对Lambda 表达式 ...
- C#中的匿名方法
C#中的匿名方法是在C#2.0引入的,它终结了C#2.0之前版本声明委托的唯一方法是使用命名方法的时代.虽然在 C# 3.0 及更高版本中,Lambda 表达式取代了匿名方法,作为编写内联代码的首选方 ...
- .NET中那些所谓的新语法之二:匿名类、匿名方法与扩展方法
开篇:在上一篇中,我们了解了自动属性.隐式类型.自动初始化器等所谓的新语法,这一篇我们继续征程,看看匿名类.匿名方法以及常用的扩展方法.虽然,都是很常见的东西,但是未必我们都明白其中蕴含的奥妙.所以, ...
- 匿名方法与Lambda表达式
1.匿名方法 在学习委托时,我们知道委托实例至少要绑定一个方法才能使用,而调用委托实际上是调用了它所关联地方法.一般来说,需要定义一个与委托签名相符的方法,并使之与委托变量关联.如以下代码: Acti ...
- 委托学习笔记后续:泛型委托及委托中所涉及到匿名方法、Lambda表达式
引言: 最初学习c#时,感觉委托.事件这块很难,其中在学习的过程中还写了一篇学习笔记:委托.事件学习笔记.今天重新温故委托.事件,并且把最近学习到和委托相关的匿名方法.Lambda表达式及泛型委托记录 ...
- 30天C#基础巩固-----值类型/引用类型,泛型,空合并操作符(??),匿名方法
一:值类型/引用类型的区别 值类型主要包括简单类型,枚举类型,和结构体类型等,值类型的实例通常被分配在线程堆栈上面变量保存的内容是实例数据本身.引用类型被分配在托管堆上,变量保存的是地址.引 ...
- C#的匿名方法
匿名方法是在初始化委托时内联声明的方法. 例如下面这两个例子: 不使用匿名方法的委托: using System; using System.Collections.Generic; using Sy ...
随机推荐
- Java并发(8):CountDownLatch、CyclicBarrier、Semaphore、Callable、Future
CountDownLatch.CyclicBarrier.Semaphore.Callable.Future 都位于java.util.concurrent包下,其中CountDownLatch.C ...
- web大文件上传控件-jsp-oracle-bug修复-Xproer.HttpUploader6
说明: 修复删除文件夹逻辑错误的问题 1.更新up6.js 更新前: 更新后: 代码: , "RemoveFolder": function (fileSvr) ...
- stopImmediatePropagation的应用
在众多的方法里面,event.stopImmediatePropagation 算是比较少用的一个方法,拼写上感觉一半像 event.stopPropagation.对于stopPropagation ...
- git 使用笔记
git操作: git checkout 分支名称 // 切换分支git branch -a // 查看分支信息和当前分支 git pull // 将服务器所有代码下载到本地git merge orig ...
- 配置ubuntu 16.04.1 LTS odoo 10.0开发环境
使用VMware Fusion 8.5.0创建ubuntu 64bit虚拟机:使用ubuntu-16.04.1-desktop-amd64.iso镜像缺省安装ubuntu,用户名odoo,密码1234 ...
- WPF快速入门系列(5)——深入解析WPF命令
一.引言 WPF命令相对来说是一个崭新的概念,因为命令对于之前的WinForm根本没有实现这个概念,但是这并不影响我们学习WPF命令,因为设计模式中有命令模式,关于命令模式可以参考我设计模式的博文:h ...
- [自娱自乐] 4、超声波测距模块DIY笔记(四)——终结篇·基于C#上位机软件开发
前言 上一节我们已经基本上把超声波硬件的发射和接收模块全部做好了,接下来我们着手开发一个软硬结合的基于C#的平面定位软件! 目录 一.整体思路 二.效果提前展示 2-1.软件部分展示 2-2.硬件部分 ...
- [51单片机] SPI nRF24L01无线 [可以放在2个单片机里实现通信]
main.c #include<reg51.h> #include"2401.h" #define uint unsigned int #define uchar un ...
- SignalR初体验
简介 ASP .NET SignalR[1] 是一个ASP .NET 下的类库,可以在ASP .NET 的Web项目中实现实时通信.什么是实时通信的Web呢?就是让客户端(Web页面)和服务器端可以 ...
- Atitit 网络爬虫与数据采集器的原理与实践attilax著 v2
Atitit 网络爬虫与数据采集器的原理与实践attilax著 v2 1. 数据采集1 1.1. http lib1 1.2. HTML Parsers,1 1.3. 第8章 web爬取199 1 2 ...