C sharp #006# 委托与事件
饮水思源:金老师的自学网站
委托(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# 委托与事件的更多相关文章
- .NET面试题系列[7] - 委托与事件
委托和事件 委托在C#中具有无比重要的地位. C#中的委托可以说俯拾即是,从LINQ中的lambda表达式到(包括但不限于)winform,wpf中的各种事件都有着委托的身影.C#中如果没有了事件,那 ...
- .NET基础拾遗(4)委托、事件、反射与特性
Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开 ...
- [转载]C#深入分析委托与事件
原文出处: 作者:风尘浪子 原文链接:http://www.cnblogs.com/leslies2/archive/2012/03/22/2389318.html 同类链接:http://www.c ...
- [转载]C#委托和事件(Delegate、Event、EventHandler、EventArgs)
原文链接:http://blog.csdn.net/zwj7612356/article/details/8272520 14.1.委托 当要把方法作为实参传送给其他方法的形参时,形参需要使用委托.委 ...
- C#委托与事件
一.在控制台下使用委托和事件 我们都知道,C#中有"接口"这个概念,所谓的"接口"就是定义一套标准,然后由实现类来具体实现其中的方法,所以说"接口,是 ...
- C#委托与事件的简单使用
前言:上一篇博文从原理和定义的角度介绍了C#的委托和事件.本文通过一个简单的小故事,来说明C#委托与事件的使用方法及其方便之处. 在阅读本文之前,需要你对委托和事件的基本概念有所了解.如果你是初次接触 ...
- C#之委托与事件
委托与事件 废话一堆:网上关于委托.事件的文章有很多,一千个哈姆雷特就有一千个莎士比亚,以下内容均是本人个人见解. 1. 委托 1.1 委托的使用 这一小章来学习一下怎么简单的使用委托,了解一些基本的 ...
- [ASP.NET MVC 大牛之路]02 - C#高级知识点概要(1) - 委托和事件
在ASP.NET MVC 小牛之路系列中,前面用了一篇文章提了一下C#的一些知识点.照此,ASP.NET MVC 大牛之路系列也先给大家普及一下C#.NET中的高级知识点.每个知识点不太会过于详细,但 ...
- .NET委托和事件
.net学习之委托和事件 1.什么是委托 通俗的说:委托就是一个能够存储符合某种格式(方法签名)的方法的指针的容器 上传图片: 2.委托语法 准备一个方法:string Hello(string ...
随机推荐
- 关于页面打印window.print()的样式问题
当我们打印网页的时候.有时候会发现.打印出来的.跟网页上看到的样式的差别有点大.这其中可能有的问题是.样式问题. 当调用打印(window.print())方法时.打印机会在网页的样式中查找 @med ...
- ORACLE存储过程详解
1.定义 所谓存储过程(Stored Procedure),就是一组用于完成特定数据库功能的SQL语句集,该SQL语句集经过编译后存储在数据库系统中.在使用时候,用户通过指定已经定义的存储过程名字并给 ...
- java设计模式(一)动态代理模式,JDK与CGLIB分析
-本想着这个知识点放到Spring Aop说说可能更合适一点,但因为上一篇有所提到就简单分析下,不足之处请多多评论留言,相互学习,有所提高才是关键! 什么是代理模式: 记得有本24种设计模式的书讲到代 ...
- [译]C# 7系列,Part 9: ref structs ref结构
原文:https://blogs.msdn.microsoft.com/mazhou/2018/03/02/c-7-series-part-9-ref-structs/ 背景 在之前的文章中,我解释了 ...
- 服务器端Mysql常用操作
原文内容来自于LZ(楼主)的印象笔记,如出现排版异常或图片丢失等问题,可查看当前链接:https://app.yinxiang.com/shard/s17/nl/19391737/f7463513-5 ...
- NLP标注工具brat 配置文件说明
快速搭建brat 通过docker: docker run --name=brat -d -p 38080:80 -e BRAT_USERNAME=brat -e BRAT_PASSWORD=brat ...
- 升级sharepoint2013遇到的坑
现在要将sharepoint2010,ProjectServer2010升级到2016的版本,需要先升级到2013的版本. 按照官方文档,瞎搞将sharepoint2010升级到2013的版本,中间出 ...
- CentOS 7 离线环境安装nginx时报错:./configure: error: C compiler cc is not found
先说解决方法: 在nginx目录下,查看objs/autoconf.err文件,该文件记录了具体的错误信息 vi objs/autoconf.err 一般就是缺少一些文件,因为我的gcc.g++也是离 ...
- Linux下快速手动产生core文件
原文链接:https://blog.csdn.net/jctian000/article/details/79695006 当我们配置好自动生成core文件的环境后,若不想写导致崩溃的程序验证,那要怎 ...
- unittest---unittest多种加载用例方法
在做自动化测试我们对执行用例很有要求,因为每条用例可能就和上一条数据有关系,那么我想要批量执行一些用例呢?这个怎么去操作呢?unittest自带的功能可以帮助到我们,我们可以通过不同的场景运用不同的执 ...