.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 "2":
return Test2;
case "3":
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 = 0; 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. .NET面试题系列[7] - 委托与事件

    委托和事件 委托在C#中具有无比重要的地位. C#中的委托可以说俯拾即是,从LINQ中的lambda表达式到(包括但不限于)winform,wpf中的各种事件都有着委托的身影.C#中如果没有了事件,那 ...

  2. .NET基础拾遗(4)委托、事件、反射与特性

    Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开 ...

  3. [转载]C#深入分析委托与事件

    原文出处: 作者:风尘浪子 原文链接:http://www.cnblogs.com/leslies2/archive/2012/03/22/2389318.html 同类链接:http://www.c ...

  4. [转载]C#委托和事件(Delegate、Event、EventHandler、EventArgs)

    原文链接:http://blog.csdn.net/zwj7612356/article/details/8272520 14.1.委托 当要把方法作为实参传送给其他方法的形参时,形参需要使用委托.委 ...

  5. C#委托与事件

    一.在控制台下使用委托和事件 我们都知道,C#中有"接口"这个概念,所谓的"接口"就是定义一套标准,然后由实现类来具体实现其中的方法,所以说"接口,是 ...

  6. C#委托与事件的简单使用

    前言:上一篇博文从原理和定义的角度介绍了C#的委托和事件.本文通过一个简单的小故事,来说明C#委托与事件的使用方法及其方便之处. 在阅读本文之前,需要你对委托和事件的基本概念有所了解.如果你是初次接触 ...

  7. C#之委托与事件

    委托与事件 废话一堆:网上关于委托.事件的文章有很多,一千个哈姆雷特就有一千个莎士比亚,以下内容均是本人个人见解. 1. 委托 1.1 委托的使用 这一小章来学习一下怎么简单的使用委托,了解一些基本的 ...

  8. [ASP.NET MVC 大牛之路]02 - C#高级知识点概要(1) - 委托和事件

    在ASP.NET MVC 小牛之路系列中,前面用了一篇文章提了一下C#的一些知识点.照此,ASP.NET MVC 大牛之路系列也先给大家普及一下C#.NET中的高级知识点.每个知识点不太会过于详细,但 ...

  9. C#委托和事件

    委托和事件都可以用来调用跟自己方法签名一样的方法,两者在使用中主要有以下区别: 委托和事件没有可比性,因为委托是类型,事件是对象: 委托可以在声明它的类外部进行调用,而事件只能在类的内部进行调用: 委 ...

随机推荐

  1. FK JavaScript之:ArcGIS JavaScript API之地图动画

    地图要素动画应用场景:动态显示地图上的要素的属性随着时间的改变而改变,并根据其属性的变化设置其渲染.比如:某水域项目中,随着时间的变化,动态展现水域的清淤进度 本文目的:对ArcGIS JavaScr ...

  2. android中的回调简单认识

    首先说一下最抽象的形式--2个类,A类和B类.A类含有1个接口.1个接口变量.(可能含有)1个为接口变量赋值的方法以及1个会使用接口变量的"地方";B类实现A中的接口,(可能)含有 ...

  3. 《Linux内核设计与实现》读书笔记 第五章 系统调用

    第五章系统调用 系统调用是用户进程与内核进行交互的接口.为了保护系统稳定可靠,避免应用程序恣意忘形. 5.1与内核通信 系统调用在用户空间进程和硬件设备间添加了一个中间层, 作用:为用户空间提供了一种 ...

  4. [lua大坑]一个莫名其妙的lua执行时崩溃引出的堆栈大小问题

    这是一个坑,天坑!如果不是我随手删除了一个本地变量,这个问题直到现在我应该也没有头绪. 首先,写了一个新的lua脚本,载入,执行.在执行的时候,出了这么一个莫名其妙的问题: EXC_BAD_ACCES ...

  5. 贪吃蛇的java代码分析(一)

    自我审视 最近自己学习java已经有了一个多月的时间,从一开始对变量常量的概念一无所知,到现在能勉强写几个小程序玩玩,已经有了长足的进步.今天没有去学习,学校里要进行毕业答辩和拍毕业照了,于是请了几天 ...

  6. thinkphp留言板例子(多条件查询)

    登录: login.html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "htt ...

  7. 给Source Insight做个外挂系列之三--构建外挂软件的定制代码框架

    上一篇文章介绍了“TabSiPlus”是如何进行代码注入的,本篇将介绍如何构建一个外挂软件最重要的部分,也就是为其扩展功能的定制代码.本文前面提到过,由于windows进程管理的限制,扩展代码必须以动 ...

  8. 初识django

    一 从下面开始 所有的的web应用其实就是就是一个socket服务器,浏览器是一个web客户端. import socket def handle_request(client): buf = cli ...

  9. WinServer2003 文件夹共享 方法设置

    文件夹设置: 5.假设我们在E盘有一个wmpub文件夹要设置在网络中共享,让大家都可以看到,首先我们右键点击WMPUB文件夹[共享和安全],弹出对话框,选择[共享此文件夹],点击[权限],弹出的对话框 ...

  10. C#_基本类型

    1.C#中的值类型包括:简单类型.枚举类型和结构类型. 2.C#中的引用类型包括:类(class).接口(interface).数组.委托(delegate).object和string. 3.调试时 ...