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. textarea的拖拽怎么解决

    textarea文本域在页面中是可以拖动的,即时你给了固定的宽度和高度,但这在我们页面布局中,使我们不需要的,因为可拖拽很多时候会影响我们页面的布局和整体的美观度. css3提供了一个resize属性 ...

  2. codeforces 347A - Difference Row

    给你一个序列,让你求(x1 - x2) + (x2 - x3) + ... + (xn - 1 - xn).值最大的一个序列,我们化简一下公式就会发现(x1 - x2) + (x2 - x3) + . ...

  3. BGP属性控制实验

    目录 实验拓扑 实验需求 实验步骤 个人小结: 实验拓扑 实验需求 更改BGP路由的属性让R4访问R1优先选R2这条路 实验步骤 1. 按照图示配置IP地址及环回口地址 R1 [R1]int g0/0 ...

  4. JAVA常用的集合类

    package com.xian.test; import java.util.ArrayList; import java.util.Enumeration; import java.util.Ha ...

  5. Kubernetes容器集群管理环境 - 完整部署(中篇)

    接着Kubernetes容器集群管理环境 - 完整部署(上篇)继续往下部署: 八.部署master节点master节点的kube-apiserver.kube-scheduler 和 kube-con ...

  6. C# Winform 自定义控件——竖着的Navbar

    效果: 描述: 这是一个可折叠的菜单导航,主要是由panel.picturebox.label完成,界面的颜色用来区分一下各个组合控件,便于调试. 首先,首先是ImageButton: 这个是由Pic ...

  7. 3、K-近邻算法

    K最近邻(k-Nearest Neighbor,KNN)分类算法 1.定义:如果一个样本在特征空间中的k个最近似(即特征空间中最临近)的样本中大多数属于某一类别,则该样本也属于这个类别. 2.计算公式 ...

  8. java并发编程(十四)----(JUC原子类)对象的属性修改类型介绍

    今天我们介绍原子类的最后一个类型--对象的属性修改类型: AtomicIntegerFieldUpdater,AtomicLongFieldUpdater,AtomicReferenceFieldUp ...

  9. Java虚拟机(二)-对象创建

    这一篇大致说明一下,对象在Java堆中对象分配.内存布局以及访问定位 1.对象的创建 虚拟机在遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引 ...

  10. vue+el-menu实现路由刷新和导航栏菜单状态保持(局部刷新页面)

    一.菜单项激活状态保持 有时,我们在项目中会有这样一个需求,即实现 一个侧导航栏,点击不同的菜单项,右边内容会跟着变化,而页面手动刷新后想要使菜单激活状态保持,那么这个功能该如何实现呢? 现在给出以下 ...