1. 委托的定义:
委托是函数的封装,它代表一"类"函数.
他们都符合一定的签名:拥有相同的参数列表,返回值类型.同时,委托也可以看成是对函数的抽象,是函数的"类".此时,委托的实例将代表一个具体的函数.
委托声明和定义了一个引用类型,它用来封装方法,用指定的签名来封装方法.一个委托的实例,可以封装静态或者实例方法.
委托是一种引用的类型,一旦为委托分配了方法,委托将与该方法完全相同的行为,委托方法的使用可以像其他任何方法一样, 具有参数和返回值
    委托的一个特征是它们的类型是安全的.可以确保被调用的方法签名是正确的,但他们并不关心调用该方法的是什么类型的对象,甚至不考虑该方法是静态方法还是实例方法.(给定委托的实例可以表示任何类型的任何对象上的实例方法或静态方法,只要方法的签名匹配于委托的签名就可以).

2. 委托的使用:
    当要把方法传递给其他方法时,需要使用委托.
为什么什么用委托:
        更加灵活的方法调用.

用于异步回调.

多线程编程中使用委托来定启动一个线程时调用的方法.

C#中的事件模型,用他们来指明处理给定事件的方法.

例:

class Program

{

//定义委托

delegate double ProcessDelegate(double param1, double param2);

static double Multiply(double param1, double param2)

{

return param1 * param2;

}

static double Divide(double param1, double param2)

{

return param1 / param2;

}

static void Main(string[] args)

{

//定义委托变量

ProcessDelegate pd;

double param1 = 20;

double param2 = 10;

Console.WriteLine("Enter M to multiply or D to divide");

string input = Console.ReadLine();

if (input == "M")

{

//初始化委托变量,要把一个函数引用赋给委托变量,

//参数是要使用的函数名,且不带括号.

pd = new ProcessDelegate(Multiply);

}

else

{

pd = new ProcessDelegate(Divide);

}

//使用该委托调用所选函数

Console.WriteLine("Result: {0}",pd(param1,param2));

Console.ReadKey();

}

3. 多播委托: 引用多个方法的委托,它连续调用每个方法.

为了把委托的单个实例合并为一个多播委托,委托必须是同类型的,返回类型必须是void,不能带输出参数out(可以带引用参数ref).

多播委托应用于事件模型中.

//声明委托

public delegate void myDelegate();

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

}

public void aa()

{

Console.WriteLine("aa");

}

public void bb()

{

Console.WriteLine("bb");

}

public void cc()

{

Console.WriteLine("cc");

}

myDelegate md;

private void button1_Click(object sender, EventArgs e)

{

md = new myDelegate(aa);

md += new myDelegate(bb);

myDelegate m = new myDelegate(cc);

md += m ;

md();

}

}

4. 异步回调:

由于实例化委托是一个对象,所以可以将其作为参数进行传递.也可以将其赋值给属性.这样,方法便可以将一个委托作为参数来接受,并且以后可以调用该委托.这样称为异步回调,是在较长的进程完成后用来通知调用方的常用方法.以这种方式使用委托时,使用委托的代码无需了解有关所用方法的实现方面的任何信息.

回调的另一个常见用法是定义自定义的比较方法并将该委托传递给排序方法.

例:

//定义委托

delegate void Del(int a,int b);

class Program

{

static void Main(string[] args)

{

Program p = new Program();

Del d = new Del(p.F_min);   //实例化委托并传给他比较的方法.

p.CallBack(10, 30, d);   //调用回调函数

}

//回调函数,将委托实例作为方法参数进行传递.

public void CallBack(int a,int b,Del d)

{

d(a, b); //执行委托

}

//输出较大的数

public void F_max(int a, int b)

{

Console.WriteLine("大的那个数为: " + Math.Max(a,b));

}
//输出较小的数

}

5. 匿名方法

匿名方法允许我们以一种”内联”的方式来编写方法代码,将代码直接与委托实例相关联,从而使得委托实例化的工作更加直观和方便.

使用例子:

class Program{

//定义委托

public delegate string dTest(string val);

static void Main(string[] args){

string mid = "男子足球队";

//匿名方法

dTest aDelegate = delegate(string param){

param += mid;

param += "加油.";

return param;

};

Console.WriteLine(aDelegate("中国"));

Console.ReadLine();

}

}

如果委托类型的返回类型为void,匿名方法里便不能返回任何值.如果不为void,匿名方法里返回的值必须和委托类型的返回值兼容.

6. 何时使用委托,何时接口?

委托:

当使用事件设计模式时.

当封装静态方法可取时.

当调用方不需要访问实现该方法的对象中的其他属性方法或接口时.

需要方便的组合.

当类可能需要该方法的多个实现时.

接口:

当存在一组可能被调用的相关方法时.

当类只需要方法的单个实现时.

当使用接口的类想要将该接口强制转换为其他接口或类类型时.

public void F_min(int a, int b)

{

Console.WriteLine("小的那个数为: " +Math.Min(a,b));

}

C# 代理/委托 Delegate的更多相关文章

  1. 【C#】事件(Event)和代理/委托(Delegate)

    代理(Delegate)的例子 delegate void MyDelegate(string str,int index); // 声明代理 class Test { public static v ...

  2. [.NET] C# 知识回顾 - 委托 delegate (续)

    C# 知识回顾 - 委托 delegate (续) [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/6046171.html 序 上篇<C# 知识回 ...

  3. [C#] C# 知识回顾 - 委托 delegate

    C# 知识回顾 - 委托 delegate [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/6031892.html 目录 What's 委托 委托的属性 ...

  4. C# 委托Delegate(一) 基础介绍&用法

    本文是根据书本&网络 前人总结的. 1. 前言 定义&介绍: 委托Delegate是一个类,定义了方法的类型, 使得可以将方法当做另一个方法的参数来进行传递,这种将方法动态地赋给参数的 ...

  5. UIScrollView的代理(delegate)

    很多时候,我们想在UIScrollView正在滚动 或 滚动到某个位置 或者 停止滚动 时做一些特定的操作 要想完成上述功能,前提条件就是能够监听到UIScrollView的整个滚动过程 当UIScr ...

  6. UIScrollView无法滚动的解决办法及UIScrollView的代理(delegate)

    1•如果UIScrollView无法滚动,可能是以下原因: Ø没有设置contentSize ØscrollEnabled = NO Ø没有接收到触摸事件:userInteractionEnabled ...

  7. 为什么不能把委托(delegate)放在一个接口(interface)当中?

    stackoverflow上有人问,为什么不能把委托放在一个接口当中? 投票最多的第一个答案第一句话说,“A Delegate is just another type, so you don't g ...

  8. c# 委托 delegate

    委托是一种存储函数引用的类型,在事件和事件的处理时有重要的用途 通俗的说,委托是一个可以引用方法的类型,当创建一个委托,也就创建一个引用方法的变量,进而就可以调用那个方法,即委托可以调用它所指的方法. ...

  9. 理解委托(delegate)及为什么要使用委托

    理解委托(delegate)及为什么要使用委托 委托:是一种定义方法签名的类型. 当实例化委托时,您可以将其实例与任何具有兼容签名的方法相关联. 您可以通过委托实例调用方法. 上述为官方说法,理解起来 ...

随机推荐

  1. Andriod开发环境的发展演变

    安卓早先只能使用JAVA开发应用程序,现在支持多种编程语言,方便了许多程序员,但主流的应该还是JAVA语言.早先安卓开发经常用到eclipse,但自从google 发布了Android studio后 ...

  2. 【BZOJ 1901】【Zju 2112】 Dynamic Rankings 动态K值 树状数组套主席树模板题

    达神题解传送门:http://blog.csdn.net/dad3zz/article/details/50638360 说一下我对这个模板的理解: 看到这个方法很容易不知所措,因为动态K值需要套树状 ...

  3. Html-Css-iframe的自适应高度方案

    先看一个示例,有两个页面,1.html通过iframe嵌入2.html,两个页面都是同域的 a.html <!DOCTYPE html> <html> <head> ...

  4. Java基础-转义字符

    Java中的字符占两个字节.一些常用的转义字符: ①\r表示接受键盘输入,相当于按下了回车键: ②\n表示换行: ③\t表示制表符,相当于Table键: ④\b表示退格键,相当于Back Space键 ...

  5. 后台管理UI推荐

    目录 一.EasyUI 二.DWZ JUI 三.HUI 四.BUI 五.Ace Admin 六.Metronic 七.H+ UI 八.其它UI 九.总结 最近要做一个企业的OA系统,以前一直使用Eas ...

  6. linux中为什么已经是root用户仍不能执行程序

    .sh文件 ,获取root权限,提示Permission Denied. 这是因为文件本身没有可执行特性. chmod +x a.sh chmod 755 a.sh

  7. 锋利的jQuery-3--.css()获取和设置元素的数字属性

    $('p').css({"fontSize": "30px", "backgroundColor": "#666"}); ...

  8. PHP大批量插入数据库的3种方法和速度对比

    第一种,使用insert into 插入,最后显示为:23:25:05 01:32:05 也就是花了2个小时多! $params = array(‘value'=>'50′); set_time ...

  9. JavaScript实现全排列

    <html xmlns="http://www.w3.org/1999/xhtml"> <head> </head> <body> ...

  10. oracle 编译中一个关于clntsh 库的一个 帖子 ,收藏!

    oracle 编译中一个关于clntsh 库的一个 帖子 ,收藏! ------------------------------------------------------------------ ...