何为委托

加了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. Spring3X升级到Spring4X时,出现的问题

    1.1.异常描述 Description Resource Path Location Type Class 'org.springframework.http.converter.json.Mapp ...

  2. Java枚举类的serialVersionUID

    起因 最近在公司里敲代码的时候偶然间发现以前留下的枚举类实现了Serializable接口,然后写了个serialVersionUID...我以前一直没在枚举类里使用过..觉得有点神奇....于是百度 ...

  3. Zabbix Agent 自动、主动注册

    简述: 今天来研究一下 Zabbix 的主动注册功能. 当你有十台机器需要监控时,你手动去添加是没有问题的.但是当你有五十台.上百台或更多服务器要监控时,你会怎么做 ? Active Agent Au ...

  4. How to map host ip and port to Hyper-V

    1.1       Add an port proxy netsh interface portproxy add v4tov4 listenport=hostport listenaddres=ho ...

  5. Spark之 SparkSql、DataFrame、DataSet介绍

    SparkSql SparkSql是专门为spark设计的一个大数据仓库工具,就好比hive是专门为hadoop设计的一个大数据仓库工具一样. 特性: .易整合 可以将sql查询与spark应用程序进 ...

  6. SVN的“Invalid authz configuration”错误的解决方法

    公司有人离职后,我把他svn账号删除 然后就报这个错了,我检查了authz文件,完全看不出什么错误.... 网上的各种方法试一遍,无果. 蹲个厕所,继续查这个问题 看到一个答案: 给不存在的组配置权限 ...

  7. inputStream输入流转为String对象(将String对象转为inputStream输入流)

    不得不说org.apache.commons包下有很多实用的工具类. org.apache.commons.io.IOUtils; 要将inputStream输入流转为String对象,只需使用org ...

  8. DBArtist之Oracle入门第4步: Oracle创建数据库

    刚开始进去后,我是懵逼的状态,不知道要干嘛,之前常用的是MSSQL,感觉两者还是有区别的: oracle中:1.查询数据库名:select name,dbid from v$database;或者sh ...

  9. jQuery autocomplete -默认

    <!doctype html> <html> <head> <meta name="content-type" content=" ...

  10. SpringBoot全局异常的捕获设置

    1.新建立一个捕获异常的实体类 如:LeeExceptionHandler package com.leecx.exception; import javax.servlet.http.HttpSer ...