09.C#委托转换和匿名方法(五章5.1-5.4)
今天将书中看的,自己想的写出来,供大家参考,不足之处请指正。进入正题。
在C#1中开发web form常常会遇到使用事件,为每个事件创建一个事件处理方法,在将方法赋予给事件中,会使用new EventHandler(),不同的事件有各种不同的EventHandler的派生类的实例,因为我这里使用的时Console App,原理是一样的,且看
//定义一个委托
delegate void Printer(); static void Main(string[] args)
{
Printer p = new Printer(Print1);
p += new Printer(Print2);
p += new Printer(Print3);
p.Invoke();
Console.ReadKey();
} static void Print1()
{
Console.WriteLine("print1");
} static void Print2()
{
Console.WriteLine("print2");
} static void Print3()
{
Console.WriteLine("print3");
}
可以看到每次给p委托一个方法时,都要new Printer(),参数为要传入的方法,可以想象在不同的委托时,要用代码显式地创建各种委托,过于繁琐。而在C#2中支持从方法组到一个兼容委托类型的隐式转换,自己想当然的理解为C++中的复制构造函数,如Printer p = Print1其实就是调用了new Printer(Print1),代码如下。
Printer p = Print1;
p += Print2;
p += Print3;
p.Invoke();
Printer p = Print1调用了Printer类的构造函数,而+=操作应该是Printer类型重载了+操作,用于两个Printer类相加,而方法组实现隐式转换,Print2和Print3隐式转换为Printer类的实例,C#2这样的操作减少了代码的输入,且更为直观,如"我只是把一个方法给到了一个对象,让它帮我执行,我才不管你要让传什么样的类型"。
- 泛型委托的协变性
- 委托返回的逆变性
对于第一点,可以理解为要给委托一个方法,用这个方法创建的委托可以是另一个委托的派生类,如所有事件处理的基类是EventHandler,当一个事件需要传入一个方法,则可以使用这个方法来创建一个从EventHandler中派生的类的实例,不用事件我不会用代码表示,请大牛告知。
对于第二点,委托定义返回类型中,如果返回类型有派生类,如在实现的方法中返回其派生类,则可以使用该方法创建委托。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
匿名方法,匿名方法使用delegate关键字,允许你指定一个内联委托实例的操作,匿名方法返回一个委托的实例。
C#2中许多内建的泛型委托,如Action(T),Predicate<T>等等,则在实例化委托时可以使用匿名函数。如
Action<int> a = delegate (int x) { Console.WriteLine(x); };
Predicate<bool> b = delegate (bool x) { return x == true; };
a.Invoke();
b.Invoke( == );
a();
b( == );
请注意匿名方法返回一个委托实例。如果只是单纯是只想处理一些无关于参数的事情,可以考虑省略参数。这让我想到一点就是在程序出错时,如果不记录参数,可以直接打印"出错了",而对于匿名函数,则可以省略参数。
System.Threading.Thread th = new System.Threading.Thread(delegate (object x) { });
System.Threading.Thread th2 = new System.Threading.Thread(delegate() { });
其实上述的讲法是错的,其实很讨厌一些话,写了很多的东西,自己看得好像有点道理,然后突然告诉你"那些东西错误的观点",这次我也来使用一下。
前面说过匿名函数返回一个委托的实例,我解理为匿名方法确实是一个方法,因为存在之前说过的隐式转换(也就是C++中的复制构造函数,或者单参数的构造函数),它返回一个符合new System.Threading.Thread()中一个合适的参数类型,所以我觉得参数是不可省略的,书中就是可以省略,其实只是System.Threading.Thread有两个重载版本而已,自己的想法,错的请大牛们指正,小弟不胜感激。
请斧正。
09.C#委托转换和匿名方法(五章5.1-5.4)的更多相关文章
- 匹夫细说C#:委托的简化语法,聊聊匿名方法和闭包
0x00 前言 通过上一篇博客<匹夫细说C#:庖丁解牛聊委托,那些编译器藏的和U3D给的>的内容,我们实现了使用委托来构建我们自己的消息系统的过程.但是在日常的开发中,仍然有很多开发者因为 ...
- 委托学习笔记后续:泛型委托及委托中所涉及到匿名方法、Lambda表达式
引言: 最初学习c#时,感觉委托.事件这块很难,其中在学习的过程中还写了一篇学习笔记:委托.事件学习笔记.今天重新温故委托.事件,并且把最近学习到和委托相关的匿名方法.Lambda表达式及泛型委托记录 ...
- 泛型委托及委托中所涉及到匿名方法、Lambda表达式
泛型委托及委托中所涉及到匿名方法.Lambda表达式 引言: 最初学习c#时,感觉委托.事件这块很难,其中在学习的过程中还写了一篇学习笔记:委托.事件学习笔记.今天重新温故委托.事件,并且把最近学习到 ...
- 多播委托和匿名方法再加上Lambda表达式
多播委托就是好几个方法全都委托给一个委托变量 代码: namespace 委托 { class Program { static void math1() { Console.WriteLine(&q ...
- 委托、匿名方法到lambda表达式
在项目中我们经常会接触lambda表达式,链式操作简洁明了.帮我们省了不少事.面对这么神奇的一个东西,是不是也应该了解了解它的本质呢. 今天我们通过一步一步的演变揭开lambda表达式的本质 一.委托 ...
- C# 匿名方法
每次写博客,第一句话都是这样的:程序员很苦逼,除了会写程序,还得会写博客!当然,希望将来的一天,某位老板看到此博客,给你的程序员职工加点薪资吧!因为程序员的世界除了苦逼就是沉默.我眼中的程序员大多都不 ...
- C#封装、多态、抽象、接口、匿名方法等学习
1:封装 将对象进行封装,并不等于将整个对象完全包裹起来,而是根据实际需要,设置一定的访问权限,用户根据不同的权限调用对象提供的功能,在C#语言中,可以使用修饰符public.internal.pro ...
- 关于C#匿名方法
作者 陈嘉栋(慕容小匹夫) 阅读目录 0x00 前言 0x01 不必构造委托对象 0x02 匿名方法初探 0x03 使用匿名方法省略参数 0x04 匿名方法和闭包 0x05 匿名方法如何捕获外部变量 ...
- 【C#复习总结】细说匿名方法
1 前言 本系列会将[委托] [匿名方法][Lambda表达式] [泛型委托] [表达式树] [事件]等基础知识总结一下.(本人小白一枚,有错误的地方希望大佬指正) 系类1:细说委托 系类2:细说匿名 ...
随机推荐
- TCP/IP详解--TCP首部选项中时间戳选项
一.简介 TCP时间戳选项会在TCP包头增加12个字节,以一种比重发超时更精确的方法来启用对RTT 的计算. 二.作用 ) TCP时间戳位于TCP选项中,kind=:lenth=:data由tim ...
- FOJ 1683 纪念SlingShot(矩阵快速幂)
C - 纪念SlingShot Description 已知 F(n)=3 * F(n-1)+2 * F(n-2)+7 * F(n-3),n>=3,其中F(0)=1,F(1)=3,F(2)=5, ...
- struts2 基本用法
Struts2必需库: commons-fileupload.jar.commons-io-1.3.2.jar.freemarker-2.3.16.jar.javassist-3.7.ga.jar.o ...
- 该如何认识ZBrush中的2.5D绘画
ZBrush不仅对3D行业进行了改革.让艺术家感到无约束自由创作的3D设计,同时它还是一个强大的绘画程序!基于强大的Pixol功能,ZBrush®将数字绘画提升到一个新的层次.如下图所示,插画功能主要 ...
- hdu 5773 The All-purpose Zero 最长上升子序列+树状数组
题目链接:hdu 5773 The All-purpose Zero 官方题解:0可以转化成任意整数,包括负数,显然求LIS时尽量把0都放进去必定是正确的. 因此我们可以把0拿出来,对剩下的做O(nl ...
- codeforces 422A A. Borya and Hanabi(暴力)
题目链接: A. Borya and Hanabi time limit per test 2 seconds memory limit per test 256 megabytes input st ...
- SSH框架总结(框架分析+环境搭建+实例源码下载) 《转》
这篇文章比较易懂,易理解: 首先,SSH不是一个框架,而是多个框架(struts+spring+hibernate)的集成,是目前较流行的一种Web应用程序开源集成框架,用于构建灵活.易于扩展的多层W ...
- Colorable Fantasy UI
Colorable Fantasy UI URL:https://www.assetstore.unity3d.com/#/content/7563 环境要求 Requires Unity 4.0.1 ...
- java 21 - 9 复制图片的4种方式
需求:复制图片 分析: 因为图片我们用记事本打开后无法读懂,所以用字节流 并且字节流复制有4种方式,所以我们尝试4种方式. 推荐第四种:缓冲字节流一次读取一个字节数组 首先写main方法: publi ...
- TIF、JPG图片手动添加地理坐标的方法(转载)
题目:为TIF.JPG图片添加地理坐标/平面直角坐标. 图片来源:GOOGLE EARTH.(当然也可以是其他知道四角点坐标的图片) 截图工具:GEtscreen(此软件截图时可以自动生成图片四角点坐 ...