您的位置:首页 > 编程语言 > C#

C#中的委托delegate(2)

2017-10-06 16:40 323 查看
委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种方法动态地给参数赋值的做法,可以避免在程序中大量使用if-else(switch)语句,同时具有更好的可扩展性。

using System;
using System.Collections.Generic;
using System.Text;

namespace Delegate {
//定义委托,它定义了可以代表的方法的类型
public delegate void GreetingDelegate(string name);
class Program {

private static void EnglishGreeting(string name) {
Console.WriteLine("Morning, " + name);
}

private static void ChineseGreeting(string name) {
Console.WriteLine("早上好, " + name);
}

//注意此方法,它接受一个GreetingDelegate类型的方法作为参数
private static void GreetPeople(string name, GreetingDelegate MakeGreeting) {
MakeGreeting(name);
}

static void Main(string[] args) {
GreetPeople("Han", EnglishGreeting);
GreetPeople("韩", ChineseGreeting);
Console.ReadKey();
}
}
}

输出如下:
Morning, Han
早上好, 韩


所以也可以这样赋值

string name1,name2;
name1 = "Han";
name2 = "韩";

GreetPeople(name1,EnglishGreeting);
GreetPeople(name2,ChineseGreeting);
Console.ReadKey();


既然委托GreetingDelegage和类型string地位一样,都是定义了一种参数类型,那么

static void Main(string[] args)
{
GreetingDelegate delegate1,delegate2;
delegate1 = EnglishGreeting;
delegate2 = ChineseGreeting;

GreetPeople("Han",delegate1);
GreetPeople("韩",delegate2);
Console.ReadKey();
}


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

static void Main(string[] args)
{
GreetingDelegate delegate1;
98cb

delegate1 = EnglishGreeting;//先给委托类型的变量赋值
delegate1 += ChineseGreeting;//给委托变量再绑定一个方法
//先后调用两个方法
GreetPeople("Han",delegate1);
Console.ReadKey();
}
输出为:
Morning,Han
早上好,韩


或者,也可以绕过GreetPeople方法,通过委托来直接调用EnglishGreeting和ChineseGreeting:

static void Main(string[] args) {
GreetingDelegate delegate1;
delegate1 = EnglishGreeting; // 先给委托类型的变量赋值(这里注意,第一次用的“=”,是赋值的语法;第二次,用的是“+=”,是绑定的语法。如果第一次就使用“+=”,将出现“使用了未赋值的局部变量”的编译错误。)
delegate1 += ChineseGreeting; // 给此委托变量再绑定一个方法

// 将先后调用 EnglishGreeting 与 ChineseGreeting 方法
delegate1 ("Jimmy Zhang");
Console.ReadKey();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: