pp看书笔记---C#高级编程第九版 第八章 【委托、Lambda表达式和事件】
2016-02-18 20:50
645 查看
一、文章脉络
二、需要掌握
委托、Func、Action的使用简单的Lambda的使用
EventHandler + WeakEventManager的使用
三、阐述自己学习后的见解
委托原理:
创建委托,编译器会在后台创建一个类
因为是一个类的性质,所以可以写在类可以写的地方:命名空间下、类中
因为是一个类的性质,所以是一种自定义的数据类型,是一种引用类型
因为是一个类的性质,所以可以加类的修饰符
使用:
定义:修饰符 + delegate + 方法前面
实例化:+= new 对象(方法);
调用:对象 + ;
作用:
传递方法
窗体间通信
回调方法(A类实例化B,B中调用A的方法)
优化代码
进阶:
掌握Action
掌握Func(~~~这两个太方便了,简化了普通委托的代码)
Lambda
原理:
一个普通方法签名:返回值 + 函数名 + 参数 + 实现
一个匿名方法:一个普通方法前面 Remove 函数名
Lambda:一个匿名方法在进行简化
若只有一个参数,匿名方法的参数可以省掉()
若实现只有一行可以省掉实现的{}
参数可以不用写类型—>编译器类型推断
不用写返回值
可以省掉return ————–>由上述可以推出Lambda的本质就是一个方法,编译器会给这个方法起名滴
simple写法:a=>a;——>传入一个a,返回一个a
a是什么类型?你传入什么类型就是什么类型,同理你也知道了这样a的参数及返回值 是什么类型
与委托的关系:
实例化委托需要带入一个方法
实例化委托可以带入一个匿名方法
实例化委托可以带入一个Lambda
好处:
可以在一个方法内定义另一个方法
如果另一个方法代码很少
使用Lambda可以做到优化代码结构的用处
进阶:
闭包:Lambda使用上文定义的局部变量
C#5.0新的特性,foreach和while会自动产生一个局部变量,保存迭代
这是C#5.0和5.0以下分别的方法
EventHandler
原理:事件驱动中大量使用,例如Button的Click,如何监听响应,Click的方法参数是不是object sender,EventArgs e
微软构造了几百个,拿来直接使用
使用:
Info类,一个发布程序的信息类,继承EventArgs
BringOut类,发布信息,其中需要一个public event EventHandler,传入的是this,new Info
Reciver类,订阅发布的信息,里面需要构造一个方法,返回值是void,参数是object sender,Info e
代码的事情用文字描述总是感觉苍白,下面给出我模仿后改造的示例代码,很好的明白(一口气写了这么多树杈)
弊病:
GC不会回收发布程序中的引用,使用泛型弱事件管理器WeakmEventManager解决这个问题
四、值得反复模仿敲打的代码
发布/订阅 + 弱事件处理程序:/// <summary> /// 发布程序信息类 /// </summary> public class SenderInfo : EventArgs //继承该类 { //发布时间 public DateTime SendTime { get{return DateTime.Now;} } //发布人姓名 public string SendName { get; set; } //发布的信息 public string Msg { get; set; } public SenderInfo() { SendName = @"潘鹏"; } public SenderInfo(string msg) { Msg = msg; } }
/// <summary> /// 发布信息 /// </summary> public class Sender { public event EventHandler<SenderInfo> Connector; //提供给订阅者订阅的连接组件 //发布信息 public void SendMsg(string msg) { //将要发布的信息告诉推送信息的人 BringOutMsg(msg); } //推送信息到各个订阅者 private void BringOutMsg(string msg) { if (null != Connector) Connector(this, new SenderInfo(msg)); } }
/// <summary> /// 订阅者 /// </summary> public class Receiver { //订阅信息的结构 public string ReceiveName { get; set; } public Receiver(string name) { ReceiveName = name; } /// <summary> /// 订阅的方法 /// </summary> /// <param name="sender"></param> /// <param name="e">发布者信息类</param> public void ReceiveMsg(object sender, SenderInfo e) { Console.WriteLine(ReceiveName + "收到:" + e.Msg + " 时间:" + e.SendTime + " 发件人:" + e.SendName); } }
static void Main(string[] args) { //新建一个发布者 var sender = new Sender(); //新建一个订阅者 var receiver = new Receiver("左转第八办事处"); //订阅者订阅消息 sender.Connector += receiver.ReceiveMsg; //发布消息 sender.SendMsg("今天总结.NET看书笔记第八章"); //**** //新建一个订阅者 var receiver2 = new Receiver("下水道总署"); //订阅消息 WeakEventManager<Sender, SenderInfo>.AddHandler(sender, "Connector", receiver2.ReceiveMsg); sender.SendMsg("I dislike coffee"); Console.ReadLine(); }
效果:
刚刚又写了一遍代码,在使用WeakEventManager的时候一直报错,原来只是的平台是.NET4.5及以上~~.~
这一章和大家分享结束~Thanks,潘鹏,加油
相关文章推荐
- c#第五次作业---正文提取
- 改善C#代码
- 关于Dll中“没有可放置在工具箱的组件”的解决方案
- C# Yield
- 【C#之控制台与窗体应用程序】
- C# 异常调试
- C#打印控件内容
- c#中的数据类型简介
- C#中SaveFileDialog 和OpenFileDialog 的用法
- C#操作水晶报表跟转换成PDF格式
- C#多线程编程
- C#基础总结——异常处理
- c# 字符串的首字母大写转换 方法
- 【转】C#时间格式
- C#使用Managed Wifi API连接带密码的SSID .
- C#生成随机数的三种方法
- C#.ToString()格式大全
- C# 约瑟夫环算法
- C# 打印表格源码(自定义)
- 灰色预测模型 c# 算法实现