何为委托

加了delegate关键字,没有方法体{}的方法模版(方法列表);委托是一种类型

public  void Write()
{
//TODO
}
//加上关键字delegate,去掉方法体{}
public delegate void Write();

委托的使用

委托基础使用三部曲:1初始化声明的委托 2绑定定义的方法 3使用

绑定方法与声明的委托的参数签名必须一致(参数个数,对应类型,返回类型)

 class Program
{
//定义方法
public static void WriteFun()
{
//TODO
}
public static void GetFun(int y)
{
//TODO
}
public static string SetFun()
{
return "";
}
//声明委托
public delegate void Write();
public delegate void Get(int x);
public delegate string Set(); static void Main(string[] args)
{
//初始化委托,绑定方法
Write write = new Write(WriteFun);
//可简写Write write = WriteFun;
Get get = GetFun;
Set set = SetFun;
//直接使用或者用invoke()
write();//write.Invoke();
get();//get.Invoke(3);
string str = set();//string str = set.Invoke();
}
}

多播委托

上面说过委托是方法列表:委托可以一次绑定多个方法,通过+=和-=来绑定和解除绑定;

 class Program
{
public static void WriteFun()
{
//TODO
}
public static void WriteFun1()
{
//TODO
}
public static void WriteFun2()
{
//TODO
} public delegate void Write(); static void Main(string[] args)
{
Write write = WriteFun;
write += WriteFun;
write -= WriteFun;
write += WriteFun1;
write += WriteFun2;
write.Invoke();
}
}

委托和事件

委托是一种类型,事件是加了关键字event的委托实例

相比与上述的普通委托实例,事件更加特殊,它不能被初始化,且不能被外部调用

public class Button
{ public ButtonClickHandle ButtonClickHandle;
public event ButtonClickHandle ButtonClickHandleEvent; public void click()
{
if (ButtonClickHandle !=null)
{
ButtonClickHandle.Invoke();
}
if (ButtonClickHandleEvent != null)
{
ButtonClickHandleEvent.Invoke();
}
}
}
public delegate void ButtonClickHandle();

区别如下

不能被初始化和外部调用,这是一种权限控制的安全机制

PS

委托尽量不要自己去实现,一方面是官方已经提供了Func与Action两种有无返回的委托,基本够用;另一方面是,委托是一种类型,如果委托的类型过多,会造成泛滥且不能够通用

进阶

lambda表达式

出自:博客园-半路独行

原文地址:http://www.cnblogs.com/banluduxing/p/8999428.html

本文出自于http://www.cnblogs.com/banluduxing 转载请注明出处。

c#进阶之浅析委托和事件的更多相关文章

  1. C# 委托和事件高级进阶

    本篇文章主要采用理论和代码实例相结合方式来论述委托和事件,涉及到一些边界技术,如软件架构的OCP原则(开-闭原则), 软件架构解耦,设计模式(Sender-Order)和事件驱动模型,有一定难度和深度 ...

  2. C#知识体系(二)用案例来理解委托与事件

    上一篇博客讲到了LinQ和lambda的常用方法 还有很多我们未知但c#设计团队已经为我们封装好的类和方法.随着我们不断的熟悉C#语言,渐渐的就会接触到其他的知识点,委托.事件.反射.线程.同步,异步 ...

  3. C#中委托和事件

    目 录 将方法作为方法的参数 将方法绑定到委托 更好的封装性 限制类型能力 范例说明 Observer 设计模式简介 实现范例的Observer 设计模式 .NET 框架中的委托与事件 为什么委托定义 ...

  4. 关于c#中委托与事件的一些理解

    文章目的:作者(初学者)在学习c#的过程中,对事件.委托及其中的“object sender,EventArgs e”一直感觉理解不透,因此在网上找了一些资料,学习并整理出了该篇笔记,希望能将自己的心 ...

  5. .NET面试题系列[7] - 委托与事件

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

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

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

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

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

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

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

  9. C#委托与事件

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

随机推荐

  1. Spring Boot实践——三种拦截器的创建

    引用:https://blog.csdn.net/hongxingxiaonan/article/details/48090075 Spring中的拦截器 在web开发中,拦截器是经常用到的功能.它可 ...

  2. 【314】putty 自动登录

    putty是一款好用的远程登录linux服务器软件,但每次输入用户名密码毕竟有些烦人,这里教你免用户名密码登陆. 本教程通过 *.bat 文件进行添加参数,下面为相应的代码: 方法一:(直接将密码/用 ...

  3. 【原】Coursera—Andrew Ng机器学习—课程笔记 Lecture 17—Large Scale Machine Learning 大规模机器学习

    Lecture17 Large Scale Machine Learning大规模机器学习 17.1 大型数据集的学习 Learning With Large Datasets 如果有一个低方差的模型 ...

  4. Mysql安装配置,修改初试密码。

    绿色版本,解压缩 D:\Software\mysql-advanced-5.6.18-winx64 my-default.ini 改名my.ini my.ini内容如下 # For advice on ...

  5. 去除winrar弹出购买许可证的提示

    我们在使用winrar压缩包管理器时,经常会遇到弹出购买许可证的提示,影响了我们操作软件的友好性,接下来我们就来处理避免这种情况的再次发生.弹出购买许可证的图形如下: 处理方法如下: 新建一个记事本文 ...

  6. 从零开始搭建k8s-20180301

    yum install -y yum-utils git etcd yum-config-manager --add-repo https://download.docker.com/linux/ce ...

  7. java算法 第七届 蓝桥杯B组(题+答案) 2.生日蜡烛

    2.生日蜡烛  (结果填空) 某君从某年开始每年都举办一次生日party,并且每次都要吹熄与年龄相同根数的蜡烛.现在算起来,他一共吹熄了236根蜡烛.请问,他从多少岁开始过生日party的?请填写他开 ...

  8. const&static&extern

    const 结论: 如果const写在指针变量名的旁边, 那么指针的指向不能变, 而指向的内存空间的值可以变 如果const写在数据类型的左边或者右边, 那么指针的指向可以改变, 但是指向的内存空间的 ...

  9. 一个Filter需要配置多个url-pattern

    最近做项目遇到一个Filter需要配置多个url-pattern,上网查了下资料,经测试,现总结下 一.完全错误的方式 Java代码 <filter> <filter-name> ...

  10. 虚拟机硬盘格式的选择:qcow2、 raw等

    虚拟机硬盘格式的选择:qcow2. raw等曾经有过一段时间,徘徊于对虚拟机硬盘格式的迷惑中,2009年,终于得出了一些结论(下面的思路基本通用于其他虚拟机) 搜了下,发现大部分用qemu或者kvm的 ...