委托
- 委托是C#中由用户自定义的一个类型
- 类表示的是数据和方法的集合,而委托实际上是一个能够持有对某个或某些方法的引用的类。
- 与其它类不同,委托类能拥有一个签名,并且它只能持有与它的签名相匹配的方法引用。签名指的是返回类型和参数类型和个数。
如何使用委托
- 声明一个委托类型
- 使用该委托类型声明一个委托变量。
- 创建委托类型的对象,把它赋值给委托变量。该委托对象包含某个方法的引用,这个方法和第1步定义的签名一致。
- 为委托对象增加其它方法。
- 像调用方法一样调用委托。此时,委托持有的每一个方法都会依次执行。
声明委托
1.声明委托的语法与定义方法的语法相似,但是没有方法体,声明的前面加关键字delegate。 2.声明委托相当于声明一个新类,所以可以在任何声明类的相同地方声明委托,可以在另一个类的内部声明,也可以在任何类的外部声明。 3.可以在委托的声明上应用任意常见的访问修饰符,如public 、private
//委托的声明,其中TestDelegate是委托的名字
public delegate void TestDelegate(int num);
//方法的声明
public void TestMethod(int num)
{
num=10;
}
创建对象
方式1:使用new 运算符的对象创建表达式。
TestDelegate td1=new TestDelegate(TestMethod);
方式2:直接用方法名进行创建
TestDelegate td2=TestMethod;
注意:方法可以来自任何类和结构,可以是实例方法,也可以是静态方法,只要方法的签名和委托的签名一致即可。
实例类EveryDayGreeting
internal class EveryDayGreeting
{
public void MorningGreeting(string name)
{
Console.WriteLine("Good Morning "+name);
}
public void NightGreeting(string name)
{
Console.WriteLine("Good Night "+name);
}
}
静态类FestivalGreeting
internal class FestivalGreeting
{
public static void ChrismasGreeting(string name)
{
Console.WriteLine("Happy Chrismas "+name);
}
public static void NewYearGreeting(string name)
{
Console.WriteLine("Happy New Year "+name);
}
}
委托类DelegateResolution应用
//需要搞明白委托类、委托变量、委托对象的概念
//声明委托类
public delegate void GreetingDelegate(string name);
internal class Program
{
static void Main(string[] args)
{
//采用new关键字创建委托实例
EveryDayGreeting everyDayGreeting = new EveryDayGreeting();
//1.持有实例类方法
//声明委托类型对象,并将其包含的方法引用赋值给委托变量
GreetingDelegate greetingDelegate1 = new GreetingDelegate(everyDayGreeting.MorningGreeting);
greetingDelegate1("xiaohu");
GreetingDelegate greetingDelegate2 = new GreetingDelegate(everyDayGreeting.NightGreeting);
greetingDelegate2("xiaoyang");
//2.持有静态类方法
GreetingDelegate greetingDelegate3 = new GreetingDelegate(FestivalGreeting.ChrismasGreeting);
greetingDelegate1("xiaoming");
GreetingDelegate greetingDelegate4 = new GreetingDelegate(FestivalGreeting.NewYearGreeting);
greetingDelegate4("xiaonian");
//采用方法名创建委托实例
//3.持有实例类方法
GreetingDelegate greetingDelegate5 = everyDayGreeting.MorningGreeting;
greetingDelegate5("xiaozhao");
GreetingDelegate greetingDelegate6 = everyDayGreeting.NightGreeting;
greetingDelegate6("xiaoqian");
//持有静态类方法
GreetingDelegate greetingDelegate7 = FestivalGreeting.NewYearGreeting;
greetingDelegate7("xiaosun");
GreetingDelegate greetingDelegate8 = FestivalGreeting.ChrismasGreeting;
greetingDelegate8("xiaoli");
Console.Read();
}
}