饮水思源:金老师的自学网站

委托(Delegate)

“不学会委托(Delegate),等于没学.NET编程!”

例程1-委托类型变量

using System;

namespace ConsoleApp1
{
class Program
{
// 1. 定义一个委托类型
public delegate int MathOptDelegate(int value1, int value2);
public static int add(int a, int b)
{
return a + b;
} static void Main(string[] args)
{
// 2. 委托类型变量可以接收一个方法引用(实例方法、静态方法都可以)
MathOptDelegate mathOpt = Program.add; Console.WriteLine(mathOpt(, )); // => 3
Console.ReadKey();
}
}
}

/

例程2-以委托变量作为参数的方法

using System;

namespace ConsoleApp1
{
class Program
{
// 1. 定义一个委托类型
public delegate void doSomething();
// 2. 定义一个以委托类型变量作为参数的方法
public static void sampleMethod(doSomething doSomething)
{
Console.WriteLine("begin to do something.");
doSomething();
Console.WriteLine("stop doing something.");
} // 3. 定义一个与委托类型匹配的方法
public static void sayHello()
{
Console.WriteLine("hello");
}
static void Main(string[] args)
{
sampleMethod(sayHello);
Console.ReadKey();
// => begin to do something.
// => hello
// => stop doing something.

}
}
}

/

例程3-委托调用列表(多路委托)

using System;

namespace ConsoleApp1
{
class Program
{
// 1. 定义一个委托类型
public delegate void doSomething(); // 2. 定义2个与委托类型匹配的方法
static void SayHello() => Console.WriteLine("hello"); static void SayGoodbye() => Console.WriteLine("Goodbye"); static void Main(string[] args)
{
doSomething doSomething = SayHello;
doSomething +=
SayGoodbye;
doSomething();
// => hello
// => Goodbye

Console.WriteLine(doSomething.GetInvocationList().Length);
// => 2
doSomething -= SayHello;
doSomething -= SayHello;
doSomething -=
SayHello;
doSomething();
// => Goodbye
Console.ReadKey();
// PS. 若有返回值,则委托变量的返回值是最后调用方法的返回值
}
}
}

Click事件探究

.NET的事件响应机制也是用委托来实现的,以实现Click事件为例,大概分为如下几个步骤↓

1、定义一个委托类型(该类型被定义在System命名空间中)

public delegate void EventHandler(object sender, EventArgs e);

2、声明一个委托类型变量(该变量被定义在相应组件中)

public event EventHandler Click;

加event和不加event的区别在于,加了event,事件只能由事件源对象激发,外界无法通过访问该变量激发。

3、挂载事件

this.button2.Click += new System.EventHandler(this.button2_Click);

button2_Click满足EventHandler的规范,该方法在适当的时候会被调用:

        private void button2_Click(object sender, EventArgs e)
{
}

/

例程-动态挂载响应方法

using System;
using System.Windows.Forms; namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} private void resp1(object sender, EventArgs e)
{
MessageBox.Show("响应1");
} private void resp2(object sender, EventArgs e)
{
MessageBox.Show("响应2");
} private void button1_Click(object sender, EventArgs e)
{
button3.Click -= resp2;
button3.Click -= resp1; // 防止累加
button3.Click += resp1;
// 上面为简单写法,
// 等价写法:button3.Click += new EventHandler(resp1);
} private void button2_Click(object sender, EventArgs e)
{
button3.Click -= resp1;
button3.Click -= resp2; // 防止累加
button3.Click += resp2;
}
}
}

C sharp #006# 委托与事件的更多相关文章

  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. .NET委托和事件

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

随机推荐

  1. 集群式Quartz定时任务框架实践

    在日常开发汇总,经常会遇到需要定时任务的场景,简单的,可以使用Spring的定时任务调度框架,也可以使用Quartz.无论使用哪种,都需要解决一个问题,那就是集群问题.一般情况下,定时任务能且仅能运行 ...

  2. HashMap面试必问的6个点,你知道几个?

    一.HashMap的实现原理? 此题可以组成如下连环炮来问 你看过HashMap源码嘛,知道原理嘛? 为什么用数组+链表? hash冲突你还知道哪些解决办法? 我用LinkedList代替数组结构可以 ...

  3. 1. 初探--prometheus调研

    一.基本概念 Prometheus 是由前 Google 工程师从 2012 年开始在 Soundcloud 以开源软件的形式进行研发的系统监控和告警工具包,自此以后,许多公司和组织都采用了 Prom ...

  4. LeetCode529. 扫雷游戏 Python3 DFS+BFS+注释

    https://leetcode-cn.com/problems/minesweeper/solution/python3-dfsbfszhu-shi-by-xxd630/ 规则: 'M' 代表一个未 ...

  5. 大白话简单工厂模式 (Simple Factory Pattern)

    大白话简单工厂模式 (Simple Factory Pattern) 从买车经历说起 毕业两年,码农张小两口无法忍受挤公交,凌晨起床抢火车票的痛苦,遂计划买车.逛了多家4S店,最终定下日产某车型的轿车 ...

  6. python中几种自动微分库

    简单介绍下python的几个自动求导工具,tangent.autograd.sympy: 在各种机器学习.深度学习框架中都包含了自动微分,微分主要有这么四种:手动微分法.数值微分法.符号微分法.自动微 ...

  7. Wonder发布v1.1正式版本,新增资产预览、脚本、AssetBundle等

    更新说明 本次版本重点增加了脚本组件,并且实现了类似于unity的AssetBundle,支持动态加载场景和资源. 相关链接 官网 Wonder官方QQ群: 106047770 相关资料 Wonder ...

  8. CURL命令学习二

    -a, --append 用于上传文件时,如果服务器上该文件不存在则创建,如果存在则追加到源文件. -K, --config <file> 指定从某个文件读取curl参数.如果指定-为文件 ...

  9. aspnet boilerplate 随笔二

    项目框架介绍: 1:Application: 在service里面事件具体业务,Dto相当于viewmodel实现了验证 2:Core:实现了数据层Model   3:EntityFrameworkC ...

  10. C++ lambda expression

    Emerged since c++11, lambda expression/function is an unnamed function object capable of capturing v ...