委托

一.委托本质是一种类型,委托也是方法一个模板.Net Framework通过函数委托来提供回调函数机制
public delegate void DelegateExample_0(int x,int y);声明了一个委托
public delegate string DelegateExample_1();
public delegate DateTime DelegateExample_2(string name,int size);

public static void show()
{

DelegateExample_0 method = new DelegateExample_0(plus);//写法一

DelegateExample_0 delegateExample_0 = plus;//写法二

//1.委托的实例化,这里只需要传一个方法名字,要求方法签名,参数的个数,返回值一致。

method.Invoke(3,4);//2.写法一调用,注意:把委托实例化成的对象相当于方法的列表
method(4.5);//写法二调用
method.BeginInvoke(6,7,null,null);异步调用

}

private static void Plus(int x,int y)
{
Console.WriteLine(“x={0},y = {1}”,x,y);
}

二.委托的意义
解耦…升级
缺陷:多个方法都是打招呼,没有把打招呼抽象在一起
public class Greeting(string name)
{
public static void GreetingChinese(string name)
{
Console.WriteLine(“你好”,name);
}
public static void GreetingEnglish(string name)
{
Console.WriteLine(“Hello”,name);
}
//low写法(使用大量的if/else)
public static void Greeting(string name,PeopleType type)//传的是值,根据值来决定行为,一个人的职责太多,单一职责原则
{
if(type == people.Chinese)
{
Console.WriteLine(“你好”,name);
}
else if(type ==people.English)
{
Console.WriteLine(“Hello”,name);
}
else
{
throw new Exception(“wrong PeopleType”);
}
}
public enum PeopleType
{
Chinese,
English
}
}
拆除逻辑的方式
public static void Greeting(string name,GreetingHandler handler)//传个方法给我,我去执行
{
Hander.Invoke(name);
}

Main()
{

GreetingHandler handlerChinese = new GreetingHandler(greetingClass.GreetingChinese);

GreetingClass.Greeting(“张三”,handlerChinese);
}

你可能感兴趣的:(C#)