.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. Web前端学习过程

    推荐学习网站www.freecodecamp.cn http://www.w3school.com.cn/ 步骤: 作者:张帅 知乎链接:https://www.zhihu.com/question/ ...

  2. <八>JDBC_重构DAO查询方法

    DAO类: import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import ...

  3. python与正则表达式

    匹配一个字符: . 任意非\n字符 [...] \d \D digit \s \S space \w \W word 匹配前一个字符的多个: * 0->> + 1->> ? 0 ...

  4. JacksonUtils.java

    package com.vcredit.framework.utils; import java.io.IOException;import java.util.List; import com.fa ...

  5. 【iCore3应用开发平台】发布 iCore3 应用开发平台寄存器说明

    PDF下载地址:http://pan.baidu.com/s/1qYeZROC

  6. Mybatis学习记录

    参考资料: <深入理解mybatis原理> MyBatis的架构设计以及实例分析

  7. Apache Spark技术实战之9 -- 日志级别修改

    摘要 在学习使用Spark的过程中,总是想对内部运行过程作深入的了解,其中DEBUG和TRACE级别的日志可以为我们提供详细和有用的信息,那么如何进行合理设置呢,不复杂但也绝不是将一个INFO换为TR ...

  8. python学习道路(day7note)(subprocess模块,面向对象)

    1.subprocess模块   因为方法较多我就写在code里面了,后面有注释 #!/usr/bin/env python #_*_coding:utf-8_*_ #linux 上调用python脚 ...

  9. IOS 绘图教程Quartz2D

    http://www.cocoachina.com/industry/20140115/7703.html http://www.cnblogs.com/wendingding/p/3803020.h ...

  10. Linux常用命令[转]

    在博客的草稿箱里一直有一份"Linux命令"的草稿,记录了一些常用的Linux命令,用于需要的时候查询.由于是出于个人使用的目的,所以这个清单并不完整.今天整理了一下这个清单,调整 ...