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学习之委托和事件的更多相关文章

  1. C#学习之委托和事件

    C#学习中,关于委托和事件的一些见解: 一.C语言中的函数指针 想要理解什么是委托,就要先理解函数指针的概念.所谓函数指针,就是指向函数的指针(等于没说-.-).比如我定义了两个函数square和cu ...

  2. C#学习之委托与事件

    委托 语法:  public  delegate void MyDelegate(); 使用:  1.定义委托----public  delegate void MyDelegate(); 2.注册委 ...

  3. .NET委托和事件

    .net学习之委托和事件   1.什么是委托 通俗的说:委托就是一个能够存储符合某种格式(方法签名)的方法的指针的容器 上传图片: 2.委托语法 准备一个方法:string Hello(string ...

  4. C#学习之初步理解委托、事件、匿名方法和Lambda

    最经在学习LinqtoSql,然后扯到Lambda表达式,然后扯到匿名方法,然后扯到委托,最后扯到事件处理...后来发现对委托这个概念和事件处理这个过程理解得不是很清晰,遂得一下学习笔记.那里说得不对 ...

  5. C#学习(一):委托和事件

    预备知识 在学习委托和事件之前,我们需要知道的是,很多程序都有一个共同的需求,即当一个特定的程序事件发生时,程序的其他部分可以得到该事件已经发生的通知. 而发布者/订阅者模式可以满足这种需求.简单来说 ...

  6. C#委托与事件学习笔记

    委托事件学习笔记 本文是学习委托和事件的笔记,水平有限,如有错漏之处,还望大神不吝赐教. 什么是委托?从字面意思来解释,就是把一个动作交给别人去执行.在实际开发中最常用的就是使一个方法可以当做一个参数 ...

  7. C#委托,事件最初浅的和最易看懂的学习笔记

    对于委托和事件,看了不少博文,当时好像都理解了,过了一段时间,又忘记的差不多了.每每如此,感觉自己很笨,记性差,其实是没有深入理解透切,没有按照自己的语言表达出来,当然容易忘记.今天又花了一些时间,好 ...

  8. C#高级编程 (第六版) 学习 第七章:委托和事件

    第七章 委托和事件 回调(callback)函数是Windows编程的一个重要方面,实际上是方法调用的指针,也称为函数指针. .Net以委托的形式实现了函数指针的概念,.Net的委托是类型安全的. 委 ...

  9. c#学习笔记03——委托和事件

    委托:一种引用类型,这种类型可以用来定义方法签名,从而使用委托实现将方法作为参数传递给其他方法.类似于C++中的函数之争,使用委托使程序员可以将方法引用封装在委托对象内. 定义和声明委托: deleg ...

随机推荐

  1. HTTP状态码(响应码)

    HTTP状态码(响应码)用来表明HTTP请求是否已经成功完成.HTTP响应类型一共分五大类:消息响应,成功响应,重定向,客户端错误,服务器端错误. 下表列出了所有HTTP状态码,以及他们各自所代表的含 ...

  2. dp重拾-完全背包--HDU 4508

    减肥记 湫湫给了你每日食物清单,上面描述了当天她想吃的每种食物能带给她的幸福程度,以及会增加的卡路里量. Input 输入包含多组测试用例. 每组数据以一个整数n开始,表示每天的食物清单有n种食物. ...

  3. 34 网络相关函数(二)——live555源码阅读(四)网络

    34 网络相关函数(二)——live555源码阅读(四)网络 34 网络相关函数(二)——live555源码阅读(四)网络 2)socketErr 套接口错误 3)groupsockPriv函数 4) ...

  4. 简单的哈希表实现 C语言

    简单的哈希表实现 简单的哈希表实现 原理 哈希表和节点数据结构的定义 初始化和释放哈希表 哈希散列算法 辅助函数strDup 哈希表的插入和修改 哈希表中查找 哈希表元素的移除 哈希表打印 测试一下 ...

  5. COGS 2437 暗之链锁 II 题解

    [题意] 给出一个有n个点的无向图,其中有n-1条主要边且这些主要边构成一棵树,此外还有m条其他边,求斩断原图的一条主要边和k条其他边使得图不连通的方案数mod109+7的值. 注意,就算你切断一条主 ...

  6. Buffer和Cache的区别

  7. struts2 中属性驱动(其实就是struts2 action 中处理 request 的参数【old 方式servlet api 封装数据到javabean中(or beanutils)】),这里属性驱动是新方式

    1.属性驱动 a\  一般的set public class UserAction extends ActionSupport { private String username; private S ...

  8. 利用ssh-copy-id无需密码登录远程服务器

    本地机器生成公钥和私钥 ssh-keygen -t rsa 一路回车,最后会在~/.ssh目录下生成id_rsa和id_rsa.pub这两个文件. 与远程服务器建立信任机制 ssh-copy-id - ...

  9. 在linux环境编译boost

    1.在boost官网:http://www.boost.org/下载相应版本的boost 2.解压boost到相应目录,在boost跟目录下有b2可执行程序,可以通过输入命令“/b2 --help”, ...

  10. FFPlay-noConsole-ver-20160409-snapshot

    ESC 退出 0 进度条开关 1 屏幕原始大小 2 屏幕1/2大小 3 屏幕1/3大小 4 屏幕1/4大小 S 下一帧 [ -2秒 ] +2秒 ; -1秒 ' +1秒 下一个帧 -> -5秒 F ...