.net学习之委托和事件
1.什么是委托
通俗的说:委托就是一个能够存储符合某种格式(方法签名)的方法的指针的容器
上传图片:
2.委托语法
准备一个方法:string Hello(string userName){}
string Hello2(string userName){}
声明委托类:delegate string DGSayHi(string userName);
创建委托对象:DGSayHi dgSay = new DGSayHi(Hello);
或 DGSsyHi dgSay = Hello;
追加方法:dgSay+=Hello2;
删除方法:dgSay -=Hello2;
调用委托:dgSay("你好");
3.多播委托
通常将包含多个方法指针的委托叫做多播委托
其实每个用户定义的委托类型编译后都是一个继承于多播委托的类,看源码:
上传图片:
4.委托的目的
(1)能将方法作为参数和返回值传递
(2)调用一个委托,执行N个方法(多播委托)
5.委托的缺点
不进行控制的缺点:可以使用Click=null来清除所有注册的事件,可以用Click()来假冒事件的触发。
解决方案,把委托成员做成private的,然后增加AddClickEventHandler、RemoveClickEventHandler两个public方法
6.什么是事件
对委托变量的可访问性进行控制封装
语法:public delegate void DGSayHi(string name);
public event DGSayHi dgSay;//创建事件委托(本质还是委托对象)
event会自动生成一个private delegate变量和两个函数: add和remove,C#编译器用这两个方法支持+=和-=操作符
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ConsoleApplication1
{
public delegate void DGEach(int index,object item);
public delegate void DGTest(); internal class Program
{
public static void Test1(DGTest dgTest)
{
dgTest(); //编译后:dgTest.Invoke();
Console.WriteLine("Test1");
} public static void Test2()
{
Console.WriteLine("Test2");
} public static void Test3()
{
Console.WriteLine("Test3");
} /// <summary>
/// 委托当返回值
/// </summary>
/// <param name="strType"></param>
/// <returns></returns>
public static DGTest InvokeTest(string strType)
{
switch (strType)
{
case "":
return Test2;
case "":
return Test3;
default:
return Test3;
}
} /// <summary>
/// 使用委托模仿jQuery each方法
/// </summary>
/// <param name="list"></param>
/// <param name="func"></param>
public static void Each(ArrayList list, DGEach func)
{
for (int i = ; i < list.Count; i++)
{
func(i, list[i]);
}
} private static void Main(string[] args)
{
#region 委托当参数 //DGTest dgTest = new DGTest(Test2);//或者 DGTest dgTest = Test2;
//Test1(dgTest); #endregion #region 委托当返回值 //DGTest dgTest = InvokeTest("2");
//dgTest(); #endregion #region 完成 Each方法 //ArrayList list = new ArrayList();
//list.Add("刘德华");
//list.Add("张学友");
//list.Add("郭富城");
//list.Add("黎明");
// Each(list, delegate(int index,object item)
// {
// Console.WriteLine(index+"---------"+item.ToString());
// }); #endregion #region 事件练习,一个设计模式的题目,说有三个对象,猫,老鼠,人,猫看见了老鼠,老鼠吓跑了,在过程中把人吵醒, 在编程过程中注意新的对象的参与
Cat c = new Cat();
c.Name = "tom";
c.DGRunEventHandler += c_DGRunEventHandler;
c.SeeMouse(c.Name);
#endregion
} private static void c_DGRunEventHandler(object sender,EventArgs e)
{
Mouse m = new Mouse();
m.Name = "mouse1";
m.DGRunEventHandler += m_DGRunEventHandler;
m.MouseRun(m);
} private static void m_DGRunEventHandler(object sender, EventArgs e)
{
Person p = new Person();
p.WakeUp(sender);
}
} public class Cat
{
public event EventHandler DGRunEventHandler;
public void SeeMouse(string name)
{
Console.WriteLine(name+"看见老鼠");
if (DGRunEventHandler != null)
{
DGRunEventHandler(this,new EventArgs());
}
} public string Name { get; set; }
}
public class Person
{
public void WakeUp(object sender)
{ Console.WriteLine((sender as Mouse).Name+"老鼠跑,人醒了");
}
public string Name { get; set; }
} public class Mouse
{
public event EventHandler DGRunEventHandler;
public void MouseRun(object sender)
{
Console.WriteLine((sender as Mouse).Name+"老鼠跑");
if (DGRunEventHandler != null)
{
DGRunEventHandler(this, new EventArgs());
}
}
public string Name { get; set; }
}
}
.net学习之委托和事件的更多相关文章
- C#学习之委托和事件
C#学习中,关于委托和事件的一些见解: 一.C语言中的函数指针 想要理解什么是委托,就要先理解函数指针的概念.所谓函数指针,就是指向函数的指针(等于没说-.-).比如我定义了两个函数square和cu ...
- C#学习之委托与事件
委托 语法: public delegate void MyDelegate(); 使用: 1.定义委托----public delegate void MyDelegate(); 2.注册委 ...
- .NET委托和事件
.net学习之委托和事件 1.什么是委托 通俗的说:委托就是一个能够存储符合某种格式(方法签名)的方法的指针的容器 上传图片: 2.委托语法 准备一个方法:string Hello(string ...
- C#学习之初步理解委托、事件、匿名方法和Lambda
最经在学习LinqtoSql,然后扯到Lambda表达式,然后扯到匿名方法,然后扯到委托,最后扯到事件处理...后来发现对委托这个概念和事件处理这个过程理解得不是很清晰,遂得一下学习笔记.那里说得不对 ...
- C#学习(一):委托和事件
预备知识 在学习委托和事件之前,我们需要知道的是,很多程序都有一个共同的需求,即当一个特定的程序事件发生时,程序的其他部分可以得到该事件已经发生的通知. 而发布者/订阅者模式可以满足这种需求.简单来说 ...
- C#委托与事件学习笔记
委托事件学习笔记 本文是学习委托和事件的笔记,水平有限,如有错漏之处,还望大神不吝赐教. 什么是委托?从字面意思来解释,就是把一个动作交给别人去执行.在实际开发中最常用的就是使一个方法可以当做一个参数 ...
- C#委托,事件最初浅的和最易看懂的学习笔记
对于委托和事件,看了不少博文,当时好像都理解了,过了一段时间,又忘记的差不多了.每每如此,感觉自己很笨,记性差,其实是没有深入理解透切,没有按照自己的语言表达出来,当然容易忘记.今天又花了一些时间,好 ...
- C#高级编程 (第六版) 学习 第七章:委托和事件
第七章 委托和事件 回调(callback)函数是Windows编程的一个重要方面,实际上是方法调用的指针,也称为函数指针. .Net以委托的形式实现了函数指针的概念,.Net的委托是类型安全的. 委 ...
- c#学习笔记03——委托和事件
委托:一种引用类型,这种类型可以用来定义方法签名,从而使用委托实现将方法作为参数传递给其他方法.类似于C++中的函数之争,使用委托使程序员可以将方法引用封装在委托对象内. 定义和声明委托: deleg ...
随机推荐
- jdk 1.7 在ubuntu 环境配置
在/opt/里解压了jdk 1.7后 设置环境变量 chen@caicai ~ $ vim .profile export JAVA_HOME=/opt/jdk1..0_79 export JRE_H ...
- String,StringBuffer,StringBuilder区别
String 字符串常量StringBuffer 字符串变量(线程安全)StringBuilder 字符串变量(非线程安全) 简要的说, String 类型和 StringBuffer 类型的主要性能 ...
- 使用uwsgi 部署python web服务
uwsgi, wsgi协议的一个很好的实现,源码在这里:https://github.com/unbit/uwsgi c语言编写,有兴趣可以研究下. 上DEMO: wsgi_server.py def ...
- mysql导入导出数据库命令
1.导出数据库:mysqldump -u 用户名 -p 数据库名 > 导出的文件名 如我输入的命令行: mysqldump -u root -p news > /home/jason/sq ...
- Ubuntu16.04/centos7 下为chrome/firefox安装flash player插件
为chrome安装flash: 打开终端,输入:sudo apt-get install pepperflashplugin-nonfree 或官网下载安装google-chrome-stable 为 ...
- 在sublime-text中设置浏览器预览
配置在Chrome,Firefox中打开 安装 SideBarEnhancements 然后通过ctrl + k, ctrl + b打开侧边栏,在侧边栏的文件中右击,找到 open width -&g ...
- C#之常见数组编码错误
摘抄自C#本质论(第四版,P55) 常见错误 错误描述 改正后的代码 int numbers[] 用于声明数组的方括号放在数据类型之后,而不是在变量标识符之后 int[] numbers; int[] ...
- POJ 1661
http://poj.org/problem?id=1661 这是一道DP的题目,求最优解 上面的这一个题是对于那个重左边开始上的函数的解释 题目要求的是从最高掉下来的小时间,那么我们就可以求从最低处 ...
- Struts2常用标签
Struts2常用标签总结 一 介绍 1.Struts2的作用 Struts2标签库提供了主题.模板支持,极大地简化了视图页面的编写,而且,struts2的主题.模板都提供了很好的扩展性.实现了更好的 ...
- Effective C++ -----条款25:考虑写出一个不抛异常的swap函数
当std::swap对你的类型效率不高时,提供一个swap成员函数,并确定这个函数不抛出异常. 如果你提供一个member swap,也该提供一个non-member swap用来调用前者.对于cla ...