委托的构成必须满足的4个条件:

  1. 声明委托类型;
  2. 必须有一个方法包含了要执行的代码;
  3. 必须创建一个委托实例;
  4. 必须调用(invoke)委托实例

委托包装的方法需要满足以下条件

  • 方法的签名必须与委托一致,方法签名包括参数的个数、类型和顺序;
  • 方法的返回类型要和委托一致,注意,方法的返回类型不属于方法签名的一部分

示例一:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ConsoleAppDelegate
{
class Program
{
//1、使用delegate关键字来定义一个委托类型
delegate void MyDelegate(int parm1, int parm2); static void Main(string[] args)
{
//2、声明委托变量d
MyDelegate d;
//3、实例化委托类型,传递的方法也可以为静态方法,这里传递的是实例方法
d = new MyDelegate(new Program().Add);
//4、委托类型作为参数传递给另一个方法
MyMethod(d);
Console.Read();
}
//该方法的定义必须与委托定义相同,即返回类型void,两个int类型的参数
void Add(int parm1,int parm2)
{
int sum = parm1 + parm2;
Console.WriteLine("两个数的和为:"+sum);
}
//方法的参数是委托类型
private static void MyMethod(MyDelegate mydelegate)
{
//5、在方法中调用委托
//mydelegate.Invoke(1, 2);
mydelegate.Invoke(1, 2);
}
}
}

 示例二:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ConsoleAppDelegateGreeting
{
class Program
{ static void Main(string[] args)
{
Program p = new Program();
p.Greeting("苍井空",p.ChineseGreeting);
p.Greeting("Tommy Li", p.EnglishGreeting);
Console.Read();
}
//定义委托类型
public delegate void GreetingDelegate(string name); //有了委托之后可以像下面这样实现打招呼方法
public void Greeting(string name,GreetingDelegate callback)
{
//调用委托
callback(name);
}
//美国人打招呼方法
public void EnglishGreeting(string name)
{
Console.WriteLine("Hello, " + name);
}
//中国人打招呼方法
public void ChineseGreeting(string name)
{
Console.WriteLine("你好, " + name);
}
}
}

总结:

  • 委托封装了包含特殊返回类型和一组参数的行为,类似包含单一方法的接口;
  • 委托类型声明中所描述的类型签名决定了哪个方法可用于创建委托实例,同时决定了调用的签名;
  • 为了创建委托实例,需要一个方法以及(对于实例方法来说)调用方法的目标;
  • 委托实例是不易变的;
  • 每个委托实例都包含一个调用列表---一个操作列表;
  • 委托实例可以合并到一起,也可以从一个委托实例中删除另一个;
  • 事件不是委托实例-----只是成对的add/remove方法(类似于属性的取值方法/赋值方法)

c#重要特性之一委托的更多相关文章

  1. .NET面试题解析(05)-常量、字段、属性、特性与委托

      系列文章目录地址: .NET面试题解析(00)-开篇来谈谈面试 & 系列文章索引 弱小和无知不是生存的障碍,傲慢才是!——<三体> 常见面试题目: 1. const和reado ...

  2. C#委托和事件?策略模式?接口回调?还不清楚的赶紧来看我扯

    早前学习委托的时候,写过一点东西,今天带着新的思考和认知,再记点东西.这篇文章扯到设计模式中的策略模式,观察者模式,还有.NET的特性之一--委托.真的,请相信我,我只是在扯淡...... 场景练习 ...

  3. C#6.0语言规范(十七) 特性

    许多C#语言使程序员能够指定有关程序中定义的实体的声明性信息.例如,在一个类中的方法的可访问性由与装饰它指定method_modifier小号public,protected,internal,和pr ...

  4. 扯一扯 C#委托和事件?策略模式?接口回调?

    早前学习委托的时候,写过一点东西,今天带着新的思考和认知,再记点东西.这篇文章扯到设计模式中的策略模式,观察者模式,还有.NET的特性之一--委托.真的,请相信我,我只是在扯淡...... 场景练习 ...

  5. C#中的委托解析

    谈及到C#的基本特性,“委托”是不得不去了解和深入分析的一个特性.对于大多数刚入门的程序员谈到“委托”时,都会想到“将方法作为方法的参数进行传递”,很多时候都只是知道简单的定义,主要是因为“委托”在理 ...

  6. .NET面试题解析(00)-开篇来谈谈面试 & 系列文章索引

    系列文章索引: .NET面试题解析(01)-值类型与引用类型 .NET面试题解析(02)-拆箱与装箱 .NET面试题解析(03)-string与字符操作 .NET面试题解析(04)-类型.方法与继承 ...

  7. .net基础学java系列(三)徘徊反思

    .net基础学java系列(三)徘徊反思 上一篇文章:.net基础学java系列(二)IDE 之 插件 这两天晚上看完了IDEA的教学视频:https://edu.51cto.com/course/1 ...

  8. Spring Security OAuth 2.0

    续·前一篇<OAuth 2.0> OAuth 2.0 Provider 实现 在OAuth 2.0中,provider角色事实上是把授权服务和资源服务分开,有时候它们也可能在同一个应用中, ...

  9. unity学习路线_重新出发

    入门级 1.先观看视频教程做一个小案例 官方英文:Unity - Learn – Modules 国内中文:Sike学院 基础级 1.你需要接触完整性的教程网站 Siki学院 Unity游戏开发从入门 ...

随机推荐

  1. UIBezierPath精讲

    前言 笔者在写本篇文章之前,也没有系统学习过贝塞尔曲线,只是曾经某一次的需求需要使用到,才临时百度看了一看而且使用最基本的功能.现在总算有时间停下来好好研究研究这个神奇而伟大的贝塞尔先生! 笔者在学习 ...

  2. BootStrap导航栏的使用

    默认的导航栏 创建一个默认的导航栏的步骤如下: 向 <nav> 标签添加 class .navbar..navbar-default. 向上面的元素添加 role="naviga ...

  3. linux中文设置

    近期出现用户发邮件乱码问题,前面服务器刚刚切换过来,忘了装中文字体了. 本地调试在windows环境下,所以每次看都好的,于是我看了下linux服务器的编码,果然默认的不是中文字体,所以在生成pdf的 ...

  4. 【转】Android 全屏方案(隐藏NavigationBar)

    http://www.07net01.com/2015/04/822292.html 在android4.0及其以上的版本中,出现了一个很屌的东西,叫做Navigation Bar,它和Status ...

  5. 将Excel数据导入MySql

    1.将选中的数据快儿拷贝到一个TXT文本文件中(记得把后面的空格消掉..),假如存到“D:\data.txt”这个位置里. 2.根据要导入的数据快儿建立MySql数据库和表,然后进入命令提示符里使用命 ...

  6. .@RequestMapping 使用方法

    1.@RequestMapping  使用方法  SpringMVC中,@RequestMapping用来处理请求,比方XXX.do @RequestMapping("/aaa") ...

  7. 并行编程之多线程共享非volatile变量,会不会可能导致线程while死循环

    背景 大家都知道线程之间共享变量要用volatilekeyword.可是,假设不用volatile来标识,会不会导致线程死循环?比方以下的伪代码: static int flag = -1; void ...

  8. Graph(2014辽宁ACM省赛)

    问题 F: Graph 时间限制: 1 Sec  内存限制: 128 MB 提交: 30  解决: 5 [cid=1073&pid=5&langmask=0" style=& ...

  9. 实现android activity之间的跳转

    android程序一般不会只有一个activity,会碰到activity之间的跳转.以下是使用Intent做应用程序内部的activity做跳转.比如,应用程序第一个activity是: 点击“下一 ...

  10. Android GridView 添加 网格线解决办法

    在使用 GridView 网格布局时,默认情况下 GridView  是没有网格线的,但是有些时候我们需要让GridView显示分割线,怎么办呢?查了不少资料,找到了一种为GridView添加网格线的 ...