委托的构成必须满足的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. Method Swizzling 和 AOP 实践(转)

    上一篇介绍了 Objective-C Messaging.利用 Objective-C 的 Runtime 特性,我们可以给语言做扩展,帮助解决项目开发中的一些设计和技术问题.这一篇,我们来探索一些利 ...

  2. iOS block并发

    多核运算 在iOS中concurrency编程的框架就是GCD(Grand Central Dispatch), GCD的使用非常简单.它把任务分派到不同的queue队列来处理.开发者把任务代码装到一 ...

  3. Java字节码(.class文件)格式详解(一)

    原文链接:http://www.blogjava.net/DLevin/archive/2011/09/05/358033.html 小介:去年在读<深入解析JVM>的时候写的,记得当时还 ...

  4. win10中android studio中的terminal不能输入

    1 打开CMD窗口右击           2    3 重启电脑,你试试就知道了.  

  5. iOS开发 autoResizingMask使用

    autoResizingMask 是UIView的一个属性,在一些简单的布局中,使用autoResizingMask,可以实现子控件相对于父控件的自动布局. autoResizingMask 是UIV ...

  6. mysql之字符集与校对集

    一.字符集 1.mysql的字符集设置非常灵活 可以设置服务器默认字符集: 数据库默认字符集: 表默认字符集: 列字符集: 如果某一级别没有指定字符集,则继承上一级. 查看所有字符集语句:show c ...

  7. Redis实战之征服 Redis + Jedis + Spring (一)

    Redis + Jedis + Spring (一)—— 配置&常规操作(GET SET DEL)接着需要快速的调研下基于Spring框架下的Redis操作. 相关链接: Redis实战 Re ...

  8. 使用ttXactAdmin、ttSQLCmdCacheInfo、ttSQLCmdQueryPlan获取SQL相关具体信息[TimesTen运维]

    使用ttXactAdmin.ttSQLCmdCacheInfo.ttSQLCmdQueryPlan获取SQL相关具体信息,适合于tt11以上版本号. $ ttversion TimesTen Rele ...

  9. 【38】通过复合塑模出Has-A 或根据某物实现出

    1.什么是复合? 复合是类型之间的一种关系,某种类型的对象内含其他类型的对象. 2.为什么需要复合,他解决什么问题? 为了代码复用. 3.复合有两层含义:Has-A和根据某物实现出.在应用域中,表示H ...

  10. Centos 7 yum 安装Apache

    1.首先查看是否已经安装 rpm    -qa    httpd 2.如果没有 yum     install      httpd      -y rpm    -ql    httpd  查看 3 ...