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. Servlet获取简单验证码

    package com.helloweenvsfei.servlet; import java.awt.Color; import java.awt.Font; import java.awt.Gra ...

  2. [转载]ODAC (odp.net) 开发到部署

    1. 确定你开发机和服务器的操作系统是32位还是64位, 而且要确定要部署的服务器是什么操作系统; 2. 下载开发机和服务器所需的dll, 地址:http://download.csdn.net/de ...

  3. 人工蜂群算法-python实现

    ABSIndividual.py import numpy as np import ObjFunction class ABSIndividual: ''' individual of artifi ...

  4. TYVJ1000 A+B problem [存个高精模板]

    A+B Problem! 通过模拟我故乡非洲的计算方式,我们很快可以解决这道题. #include<iostream> #include<cstdio> #include< ...

  5. POJ1737 Connected Graph

    Connected Graph Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 3156   Accepted: 1533 D ...

  6. iOS开发的那些坑

    最近重新拿起了iOS的开发,使用OC和Swift混编,碰到了一些比较棘手的问题,在这里记录下来,方便自己以后或他人不再入坑.这篇文章的内容包含: UITableViewCell的真实结构在iOS的环境 ...

  7. ASP.NET MVC ActionFilterAttribute的执行顺序

    http://diaosbook.com/Post/2014/6/3/execution-order-of-actionfilter-aspnet-mvc ASP.NET MVC里面我们要自定义Act ...

  8. uC/OS-II源码分析

    uC/OS-II源码分析 首先从main.c文件看起,下面是uC/OS-II main.C的大致流程: main(){ OSInit(); TaskCreate(...); OSStart(); } ...

  9. 多线程下载的原理&断点下载的原理

    1)多线程下载说明:

  10. 深入浅出MySQL双向复制技术

    设置MySQL数据同步(单向&双向)由于公司的业务需求,需要网通和电信的数据同步,就做了个MySQL的双向同步,记下过程,以后用得到再翻出来,也贴出来供大家参考. 一.准备服务器 由于MySQ ...