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(委托 也叫代表,代表一类方法)的更多相关文章

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

    原文地址:C#中的委托(Delegate)和事件(Event) 作者:jiyuan51 把C#中的委托(Delegate)和事件(Event)放到现在讲是有目的的:给下次写的设计模式--观察者(Obs ...

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

    转自:http://blog.chinaunix.net/uid-576762-id-2733751.html   把C#中的委托(Delegate)和事件(Event)放到现在讲是有目的的:给下次写 ...

  3. 委托(3).net 2.0中的委托

    由于.net 2.0引入了匿名方法,所以创建委托的方式可以更简化了. .net 2.0中的委托 有了匿名方法,上一篇的例子可以简化为: namespace DelegateDemo { //声明委托 ...

  4. 委托(4).net 3.5中的委托

    .net 3.5引入了Linq,lambda表达式,所以委托的创建变得更加简单和优雅了. .net 3.5中的委托 引入lambda表达式后,就不需要再使用匿名方法了,使得创建委托的方式更加简单和优雅 ...

  5. 深刻理解:C#中的委托、事件

    C#中的事件还真是有点绕啊,以前用JavaScript的我,理解起来还真是废了好大劲!刚开始还真有点想不明白为什么这么绕,想想和JS的区别,最后终于恍然大悟! C#中事件绕的根本原因: C#的方法,它 ...

  6. 转载->C#中的委托的使用和讲解

    C# 中的委托 引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容 ...

  7. 第二节:1_C#中的委托的使用和讲解(转)

    C# 中的委托 引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容 ...

  8. 十二、C# 委托与Lambda表达式(匿名方法的另一种写法)

    委托与Lambda表达式   1.委托概述 2.匿名方法 3.语句Lambda 4.表达式Lambda 5.表达式树   一.委托概述 相当于C++当中的方法指针,在C#中使用delegate 委托来 ...

  9. Unity C# 多态 委托 事件 匿名委托 Lambda表达式 观察者模式 .NET 框架中的委托和事件

    一.多态 里氏替换原则: 任何能用基类的地方,可以用子类代替,反过来不行.子类能够在基类的基础上增加新的行为.面向对象设计的基本原则之一. 开放封闭原则: 对扩展开放,意味着有新的需求或变化时,可以对 ...

随机推荐

  1. 基于Extjs的web表单设计器 第一节

    前面一节介绍了表单设计器的背景和最终的大概样式,本节主要介绍表单设计器的需求及功能设计. 在讲需求之前先明确几个常用的概念: 主表或者卡片表——具有多行多列的一个区域的控件块,如下图所示. 明细表—— ...

  2. gitignore 使用

    在git中如果想忽略掉某个文件,不让这个文件提交到版本库中,可以使用修改根目录中 .gitignore 文件的方法(如无,则需自己手工建立此文件).这个文件每一行保存了一个匹配的规则例如: # 此为注 ...

  3. Jenkins启动Tomcat时提示Neither the JAVA_HOME nor the JRE_HOME environment variable is defined

      Jenkins构建提示: [SSH] executing...Neither the JAVA_HOME nor the JRE_HOME environment variable is defi ...

  4. shell脚本修改文件

    https://blog.csdn.net/qq_37674858/article/details/80066264 2.2 使用sed命令对文件中的字符替换 例如:将aaaa字符串修改为bbbb [ ...

  5. tinymce与prism代码高亮实现及汉化的配置

    简单介绍:TinyMCE是一个轻量级的基于浏览器的所见即所得编辑器,由JavaScript写成.它对IE6+和Firefox1.5+都有着非常良好的支持.功能方强大,并且功能配置灵活简单.另一特点是加 ...

  6. mac下wordpress环境搭建

    mac下本来就有apache和php,只需要配置以下+安装mysql 1.Apache 预装目录在  /etc/apache2: 默认的网站目录在 /Library/WebServer/Documen ...

  7. 【OCP-12c】2019年CUUG OCP 071考试题库(78题)

    78.View the exhibit and examine the structure of the CUSTOMERStable. Which two tasks would require s ...

  8. 常见的vue面试题

    001.v-show与v-if的区别v-show:操作的是元素的display属性 v-if:操作的是元素的创建和插入相比较而言v-show的性能要高 002.methods.computed.wat ...

  9. MysqliDb 库的一些使用简单技巧(php)

    一.分页功能 假设接口要接受输入:page, page_limit,key,value,table 来查询 table 中 key like value 的元组中以 page_limit 为 page ...

  10. html中设置data-*属性值 并在js中进行获取属性值

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...