C#中的委托 Delegate(委托 也叫代表,代表一类方法)
1. 委托类似与 C或C++中的函数指针,但委托是 面向对象的,并且是类型安全的
详情可查看官方文档:https://msdn.microsoft.com/en-us/library/ms173172.aspx
2. 委托 就相对与 一类方法 (即方法类,或者方法接口)
而这一类方法都具有相同的 修饰符、形参以及 返回值类型
2.1. 委托 既是方法:
声明委托的方式如下:在修饰符后加上 delegate ['dɛlɪɡət]关键字
public delegate void Del(string message);
从格式上看,它与方法的声明极为相似,就是多了个 delegate关键字而已
表示声明了一类,修饰符为public、一个string类型形参的、没有返回值的方法
2.2. 但 委托 不是普通的方法,因为 它也是类,
所以委托只能声明,而不能定义,如不能这样写:
private delegate void Doing(string name){
System.Windows.MessageBox.Show();
}
2.3. 实例化委托,调用委托
//声明一个void, 形参是string的委托
public delegate void Del(string name); //定义个个cut方法
public void cut(string name)
{
System.Windows.MessageBox.Show("fuck " + name);
}
//实例化委托,传的参数是一个方法的名字,这里是cut
Del a = new Del(cut);
a("CCC");//调用委托,相当于调用cut("CCC");
3. 委托 有什么用,搞这么复杂有什么意思
3.1. 将方法名作为方法参数传递,提高代码的多变性和灵活性,如下:
public delegate void SayHello();
public void SayInEnglish(){
toSay = "Hello";
}
public void SayInChinese(){
toSay = "你好";
}
public void HelloToSomebody(SayHello say){//将方法作为参数来传递
say(toSay);
System.Windows.MessageBox.Show(toSay);
}
以及:
public delegate void Save(string word);
public void SaveTime(string str)
{
string abc = "abc";
System.Windows.MessageBox.Show("我做我的事情 "+str);//WPF
}
public void SaveNothing(string str)
{
System.Windows.MessageBox.Show("没事可做啊 "+str);
}
public void HelloToSomebody(Save save)
{
save("试一试");
}
public static void main(string[] args){
Save s = new Save(SaveTime);
Save s2 = new Save(SaveNothing);
HelloToSomebody(s);
HelloToSomebody(s2);
}
/////////////////////////////////
结果是: 我做我的事情 试一试
没事可做啊 试一试
4. 委托 的多播 (Multicasting of a Delegate) "+="、"-="
using System; delegate int NumberChanger(int n);
namespace DelegateAppl
{
class TestDelegate
{
static int num = 10;
public static int AddNum(int p)
{
num += p;
return num;
} public static int MultNum(int q)
{
num *= q;
return num;
}
public static int getNum()
{
return num;
} static void Main(string[] args)
{
// 创建委托实例
NumberChanger nc;
NumberChanger nc1 = new NumberChanger(AddNum);
NumberChanger nc2 = new NumberChanger(MultNum);
nc = nc1;
nc += nc2;//到这里,nc其实绑定了2个委托,调用时会按绑定的顺序执行
// 调用多播
nc(5);
Console.WriteLine("Value of Num: {0}", getNum());
Console.ReadKey();
}
}
} ////////////////////////////////////
结果是: Value of Num: 75
注意:委托对象可使用 "+" 运算符进行合并。一个合并委托调用它所合并的两个委托。只有相同类型的委托可被合并。
"-" 运算符可用于从合并的委托中移除组件委托。
总结:
1. 委托 即使 方法,又是 类(一种特殊的方法:可以方便统一调用;特殊的类,能当方法来用的类,这也够特殊了吧),委托是一类方法
2. 委托 先声明,后实例化,然后才能调用,委托的参数 是一个方法名
3. 委托的 多调 "+=" , 相反操作 "-="
4. 委托 主要用于事件 还有回调函数中····
也可查看:http://www.tracefact.net/csharp-programming/delegates-and-events-in-csharp.aspx
参考:http://www.runoob.com/csharp/csharp-delegate.html
C#中的委托 Delegate(委托 也叫代表,代表一类方法)的更多相关文章
- C#中的委托(Delegate)和事件(Event)
原文地址:C#中的委托(Delegate)和事件(Event) 作者:jiyuan51 把C#中的委托(Delegate)和事件(Event)放到现在讲是有目的的:给下次写的设计模式--观察者(Obs ...
- (转)C#中的委托(Delegate)和事件(Event)
转自:http://blog.chinaunix.net/uid-576762-id-2733751.html 把C#中的委托(Delegate)和事件(Event)放到现在讲是有目的的:给下次写 ...
- 委托(3).net 2.0中的委托
由于.net 2.0引入了匿名方法,所以创建委托的方式可以更简化了. .net 2.0中的委托 有了匿名方法,上一篇的例子可以简化为: namespace DelegateDemo { //声明委托 ...
- 委托(4).net 3.5中的委托
.net 3.5引入了Linq,lambda表达式,所以委托的创建变得更加简单和优雅了. .net 3.5中的委托 引入lambda表达式后,就不需要再使用匿名方法了,使得创建委托的方式更加简单和优雅 ...
- 深刻理解:C#中的委托、事件
C#中的事件还真是有点绕啊,以前用JavaScript的我,理解起来还真是废了好大劲!刚开始还真有点想不明白为什么这么绕,想想和JS的区别,最后终于恍然大悟! C#中事件绕的根本原因: C#的方法,它 ...
- 转载->C#中的委托的使用和讲解
C# 中的委托 引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容 ...
- 第二节:1_C#中的委托的使用和讲解(转)
C# 中的委托 引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容 ...
- 十二、C# 委托与Lambda表达式(匿名方法的另一种写法)
委托与Lambda表达式 1.委托概述 2.匿名方法 3.语句Lambda 4.表达式Lambda 5.表达式树 一.委托概述 相当于C++当中的方法指针,在C#中使用delegate 委托来 ...
- Unity C# 多态 委托 事件 匿名委托 Lambda表达式 观察者模式 .NET 框架中的委托和事件
一.多态 里氏替换原则: 任何能用基类的地方,可以用子类代替,反过来不行.子类能够在基类的基础上增加新的行为.面向对象设计的基本原则之一. 开放封闭原则: 对扩展开放,意味着有新的需求或变化时,可以对 ...
随机推荐
- Linux socat轻松实现TCP/UDP端口转发
1.TCP端口转发 socat -d TCP4-LISTEN:,reuseaddr,fork TCP4: 2.UDP端口转发 socat -T UDP4-LISTEN:,reuseaddr,fork ...
- Sql 四大排名函数(ROW_NUMBER、RANK、DENSE_RANK、NTILE)
row_number() over() 1.2.3.4.5.6.7 rank() over() 1.2.2.4.5.5.7 dense_rank() over() 1.2.2.3.3.4.5 n ...
- JS控制输入框,输入正确的价格
在HTML中,验证输入内容的正确性是提高用户体验的一方面,同时也是初步保证了数据的来源的正确性. 下面是一个常用的控制输入正确的价格的JS代码 function clearNoNum(obj) { o ...
- CheckBox使用记录
页面显示 页面代码 <div> <div><input type="checkbox" value="" class=" ...
- C# task和timer实现定时操作
C#中,定时器,或者叫作间隔器,每隔一段时间执行一个操作. 1.Timer本身就是多线程 C#中为不同场合下使用定时器,提供了不同的Timer类,在asp.net中一般使用System.Timers. ...
- 修改 Cloud image 的密码的简单方法
下载工具: yum -y install libguestfs-tools.noarch 打开DEBUG: export LIBGUESTFS_DEBUG=1 LIBGUESTFS_TRACE=1 ...
- “全栈2019”Java异常第十一章:重写方法时只能抛出父类异常子集
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java异 ...
- IDEA不能实时更新jsp页面的问题
第一步: 第二步 第三步: 将这三个选项 改成
- Java_IO流输入输出
第三章 输入输出 一.I/O Input/Output 二.File 用途:对文件和目录进行常规操作(除文件读写操作外). 方法:exists():判断文件或目录是否存在 isFile():判断是否是 ...
- 洛谷P5282 【模板】快速阶乘算法(多项式多点求值+MTT)
题面 传送门 前置芝士 \(MTT\),多项式多点求值 题解 这题法老当初好像讲过--而且他还说这种题目如果模数已经给定可以直接分段打表艹过去 以下是题解 我们设 \[F(x)=\prod_{i=0} ...