当前位置:首页 > Windows程序 > 正文

C#中的委托 Delegate

2021-03-25 Windows程序

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. 委托 主要用于事件 还有回调函数中····

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/67144.html