delegate 是表示对具有特定参数列表和返回类型的方法的引用的类型。 在实例化委托时,你可以将其实例与任何具有兼容签名和返回类型的方法相关联。 你可以通过委托实例调用方法。

委托用于将方法作为参数传递给其他方法。 事件处理程序就是通过委托调用的方法。 你可以创建一个自定义方法,当发生特定事件时,某个类(如 Windows 控件)就可以调用你的方法(举个例子,Winform上拖拽完button,然后双击,后台生成这个button的点击事件,这样这个button的点击事件就跟你的方法绑定起来了)。

需求:遇到到不同国家的人,以不同方式跟他打招呼。

Talking is easy ,show me the codes .

namespace ConsoleDemo
{
class Program
{
static void Main(string[] args)
{
List<People> pp = new List<People>();
pp.Add(new People { Name = "马大云", Country = "中国" });
pp.Add(new People { Name = "Bill Gat", Country = "USA" }); pp.ForEach(p => Say(p));
} public static void Say(People p)
{
if (p != null && !string.IsNullOrEmpty(p.Country))
{
if (p.Country.Equals("中国", StringComparison.OrdinalIgnoreCase))
{
Chinesenihao(p.Name);
}
if (p.Country.Equals("USA", StringComparison.OrdinalIgnoreCase))
{
EnglishHello(p.Name);
}
}
}
public static void Chinesenihao(string name)
{
Console.WriteLine($"{name},老表,吃饭没?");
} public static void EnglishHello(string name)
{
Console.WriteLine($"hi,{name},the weather is nice today.");
} } public class People
{
public string Name { get; set; }
public string Country { get; set; }
}
}

上面这种实现是可以的,满足了需求,当再来几个国家,Say方法里面再加几个就阔以了。

但是当你工作几年后,你还这么写,那就不清真(zhuang bi shi bai )了。

Talking is easy ,show me the codes .

 public delegate void sayhellodelegate(string name);
class Program
{ static void Main(string[] args)
{ List<People> pp = new List<People>();
pp.Add(new People { Name = "马大云", Country = "中国" ,sayfunction= Chinesenihao });
pp.Add(new People { Name = "Bill Gat", Country = "USA" ,sayfunction= EnglishHello }); pp.ForEach(p => Say(p));
} public static void Say(People p)
{
p.sayfunction(p.Name);
}
public static void Chinesenihao(string name)
{
Console.WriteLine($"{name},老表,吃饭没?");
} public static void EnglishHello(string name)
{
Console.WriteLine($"hi,{name},the weather is nice today.");
} } public class People
{
public string Name { get; set; }
public string Country { get; set; } public sayhellodelegate sayfunction { get; set; }
}

上面的代码中,sayhellodelegate当做一种类型在用。这也是为什么文章开头的那句是这样的:delegate 是表示对具有特定参数列表和返回类型的方法的引用的类型。

新需求:遇到到不同国家的人,以不同方式跟他打招呼,如果有多个国家的国籍,择使用多种方式打招呼。

 static void Main(string[] args)
{ List<People> pp = new List<People>();
var t = new People { Name = "马大云", Country = "中国", sayfunction = Chinesenihao };
t.Country = "中国,USA";
t.sayfunction += EnglishHello;
pp.Add(t);
pp.Add(new People { Name = "Bill Gat", Country = "USA", sayfunction = EnglishHello }); pp.ForEach(p => Say(p));
}

其他代码不动,在给Sayfunction 赋值时坐了追加就满足了需求。

这是delegate的另外一个特性:

可以将多个方法赋给同一个委托,或者叫将多个方法绑定到同一个委托,当调用这个委托的时候,将依次调用其所绑定的方法。

当然可以追加,也可以取消。

使用委托可以将多个方法绑定到同一个委托变量,当调用此变量时(这里用“调用”这个词,是因为此变量代表一个方法),可以依次调用所有绑定的方法。

c#中的委托01的更多相关文章

  1. Objective-C中的委托(代理)模式

    我个人更喜欢把委托(Delegate)模式称为代理(Proxy)模式.还是那句话,第一次接触代理模式是在Java中接触的,在Java中实现代理模式和接口是少不了的.当时学习Spring的时候用到了接口 ...

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

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

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

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

  4. C# 中的委托和事件

    觉得这篇文章写的非常好,大神之作,由简入繁,对我这种初学者来说帮忙很大,特此留存下. 摘自:http://tracefact.net/CSharp-Programming/Delegates-and- ...

  5. C# 中的委托和事件(转)

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

  6. C# 中的委托和事件(转载)

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

  7. 【转】C# 中的委托和事件

    阅读目录 C# 中的委托和事件 引言 将方法作为方法的参数 将方法绑定到委托 事件的由来 事件和委托的编译代码 委托.事件与Observer设计模式 .Net Framework中的委托与事件 总结 ...

  8. 第3章 C#中的委托和事件

    .NET框架中的委托和事件 using System; using System.Collections.Generic; using System.Linq; using System.Text; ...

  9. 分分钟用上C#中的委托和事件之窗体篇

    上次以鸿门宴的例子写了一篇名为<分分钟用上C#中的委托和事件>的博文,旨在帮助C#初学者迈过委托和事件这道坎,能够用最快的速度掌握如何使用它们.如果觉得意犹未尽,或者仍然不知如何在实际应用 ...

随机推荐

  1. LinkedList实现类

    List还有一个LinkedList的实现,它是一个基于链表实现的List类,对于顺序访问集合中的元素进行了优化,特别是当插入.删除元素时速度非常快.因为LinkedList即实现了List接口,也实 ...

  2. 2019.7 佳木斯培训A层

    day1题目及题解 day2题目及题解 day3题目及题解 day4题目及题解 day5题目及题解

  3. Java 求字符串中出现频率最高字符

    前段时间接触的这个题目,大体理解了,还有些小地方仍待进一步品味,暂且记下. import java.util.ArrayList; import java.util.Arrays; import ja ...

  4. vue通信、传值的多种方式(详细)

    转载自https://blog.csdn.net/qq_35430000/article/details/79291287

  5. 使用 OpenSSL为WindowsServer远程桌面(RDP)创建自签名证书 (Self-signed SSL certificate)

    前言 笔者查阅很多资料,才写成此文章,如有错误,请读者们及时提出. 一般大家使用远程桌面(Remote Desktop)连接Windows Server时,总会有一个警告提示,如图1 图1 出现此警告 ...

  6. BFS DFS模板

    转载于https://blog.csdn.net/alalalalalqp/article/details/9155419 BFS模板: #include<cstdio> #include ...

  7. ASP.NET Core MVC 之视图组件(View Component)

    1.视图组件介绍 视图组件是 ASP.NET Core MVC 的新特性,类似于局部视图,但它更强大.视图组件不使用模型绑定,并且仅依赖于调用它时所提供的数据. 视图组件特点: 呈块状,而不是整个响应 ...

  8. Go和Python学习计划

    计划虽然不一定能实现,但还是要有的,万一实现了呢. 一.学习Go 1.先看尚雪谷https://www.bilibili.com/video/av48141461/?p=12的go语言全套,把基础的过 ...

  9. html的一些基本属性介绍

    一.html的属性类型: 1.常见标签属性: a.<h1>:align对其方式      例如:<h1  align="right"> hhhhh</ ...

  10. python3学习-Queue模块

    python标准库中带有一个Queue模块,顾名思义,队列.该模块也衍生出一些基本队列不具有的功能. 我们先看一下队列的方法: put 存数据 get 取数据 empty 判断队列是否为空 qsize ...