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.runoob.com/csharp/csharp-delegate.html

时间: 2024-11-09 16:20:20

C#中的委托 Delegate的相关文章

C#中的委托(Delegate)和事件(Event)

C#中的委托(Delegate)和事件(Event) 2007-11-30 11:40:00 分类: 把C#中的委托(Delegate)和事件(Event)放到现在讲是有目的的:给下次写的设计模式——观察者(Observer)有一个参考. 委托和事件应该是C#相较于C++等之前的非托管的语言提出的一个新的术语(term).“旧瓶装新酒”这样的描述似乎有些“贬义”,但确实是这样.委托也好,事件也好最初的起源是C/C++中的函数指针,关于函数指针的简单介绍可以参见我以前的一篇<C/C++中指向函数的

关于OC中的委托delegate

使用委托: 可以看成是一个类中声明了一个protocol,另外一个类作为委托来实现这个protocol内的方法. 比如当在iPhone中创建一个表时,需要使用UITableView类.但是这个类不知道表的标题,也不知道有多少的部分或行需要显示,也不知道表中每行或每个单元格中应该显示什么内容.所以它将这一系列的工作委托给你,利用定义的一个协议:UITableViewDateSource.当他需要显示信息时,就调用适当的协议方法. UITableView类中还定义了一个UITableViewDele

.Net: C#中的委托(Delegate)和事件(Event)

委托和事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真 是太容易了,而没有过去的人每次见到委托和事件就觉得心里憋得慌,浑身不自在.本文中,我将通过两个范例由浅入深地讲述什么是委托.为什么要使用委托.事 件的由来..Net Framework中的委托和事件.委托和事件对Observer设计模式的意义,对它们的中间代码也做了讨论. P1:什么是委托?事件是委托吗? 答:委托可以把一个方法

C# 中的委托和事件

http://www.cnblogs.com/JimmyZhang/archive/2007/09/23/903360.html 文中代码在VS2005下通过,由于VS2003(.Net Framework 1.1)不支持隐式的委托变量,所以如果在一个接受委托类型的位置直接赋予方法名,在VS2003下会报错,解决办法是显式的创建一个委托类型的实例(委 托变量).例如:委托类型 委托实例 = new 委托类型(方法名); 欢迎浏览本文的后续文章: C#中的委托和事件(续) 引言 委托 和 事件在

C#中的委托和事件(续)

C#中的委托和事件(续) 引言 如果你看过了 C#中的委托和事件 一文,我想你对委托和事件已经有了一个基本的认识.但那些远不是委托和事件的全部内容,还有很多的地方没有涉及.本文将讨论委托和事件一些更为细节的问题,包括一些大家常问到的问题,以及事件访问器.异常处理.超时处理和异步方法调用等内容. 为什么要使用事件而不是委托变量? 在 C#中的委托和事件 中,我提出了两个为什么在类型中使用事件向外部提供方法注册,而不是直接使用委托变量的原因.主要是从封装性和易用性上去考虑,但是还漏掉了一点,事件应该

分分搞懂c#中的委托

分分搞懂c#中的委托: 不说废话,不来虚的概念,不管代码是否有意义,看我的优化之路,你会理解委托了: 源代码1 public class test { //我们不管代码是否有意义,我们直接看代码重构和一步步优化的过程 int flage = 1; public void show(int a) { if (flage == 1) { do1(a); } else if (flage == 2) { do2(a); } else if (flage == 3) { do3(a); } else i

(转)C# 中的委托和事件

C# 中的委托和事件 引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去的人每次见到委托和事件就觉得心里别(biè)得慌,混身不自在.本文中,我将通过两个范例由浅入深地讲述什么是委托.为什么要使用委托.事件的由来..Net Framework中的委托和事件.委托和事件对Observer设计模式的意义,对它们的中间代码也做了讨论. 将方法作为方法的参

C#中的委托(转)

C# 中的委托和事件 引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去的人每次见到委托和事件就觉得心里别(biè)得慌,混身不自在.本文中,我将通过两个范例由浅入深地讲述什么是委托.为什么要使用委托.事件的由来..Net Framework中的委托和事件.委托和事件对Observer设计模式的意义,对它们的中间代码也做了讨论. 将方法作为方法的参

第61课 模型视图中的委托(上)

1. Qt模型视图对用户输入的处理 (1)传统的MVC设计模式 (2)Qt中的模型视图设计模式如何处理用户输入? ①视图中集成了处理用户输入的功能(即委托) ②视图将用户输入作为内部独立的子功能来实现 ③模型负责组织数据,视图负责显示数据,委托则用于编辑修改数据. 2. 模型视图中的委托 (1)委托(Delegate)是视图中处理用户输入的部件(如编辑框.单选按钮等) (2)视图可以设置委托对象用于处理用户输入 (3)委托对象负责创建和显示用户输入的上下文(内容),如编辑框的创建和显示. (4)