看了之前的文章,大家都知道Unity使用脚本最主流的语言就是C#语言。作为程序员小哥哥,平时经常会听到C#语言中的委托和事件吧。我们今天重点来学习一下委托。
委托和事件各种项目的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易。它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去的人每次见到委托和事件就觉得心里憋得慌,浑身不自在。本文中,将通过两个案例由浅入深地讲述什么是委托、为什么要使用委托以及事件的由来。
委托的关键字是delegate。也就是和int、string一样,用delegate关键字来声明一个委托类型。而委托的声明方式和类却完全不同,这是怎么一回事?实际上,委托在编译的时候确实会编译成类。因为所定义的委托类型在C#中属于引用类型,也是一个类,所以在任何可以声明类的地方都可以声明委托类型。更多的内容将在下面讲述,现在,请看看这个案例的完整代码:
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("Jimmy Zhang", EnglishGreeting);
GreetPeople("张子阳", ChineseGreeting);
Console.ReadKey();
}
}
}
输出如下:
Morning, Jimmy Zhang
早上好, 张子阳
下面我们介绍委托的常用的四种形式:
//delegate 匿名委托
Niming nm = delegate (string str)
{
Console.WriteLine("我是匿名委托" + str);
return str.ToUpper();
};
Console.WriteLine(nm("nihao"));
nm = delegate (string str)
{
Console.WriteLine("我是匿名委托" + str);
return str.ToLower();
};
Console.WriteLine(nm("NiHAO"));
//lambda 表达式
//格式:(参数) =>{要执行的方法体;};
Test test = (int a) => { a *= 10; Console.WriteLine(a); };
test(2);
GreetingDelegate gd = (string name) =>
{
Person.EnglishSpeek(name);
Person.ChineseSpeek(name);
Person.EnglishSpeek(name);
};
gd("小丽");
//Func 委托 最后一个为返回值类型out
Func
{
return str1 + str2;
};
Console.WriteLine(s("a", "b"));
//Action委托 不需要返回值
Action
{
Console.WriteLine(str1 + str2);
Person.EnglishSpeek(str1);
};
str("你好", "乔安");
最后,我们对委托做一个总结:
委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。