什么是委托?在.Net Framework中的应用非常广泛,委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If - Else(Switch)语句,同时使得程序具有更好的可扩展性。对ObServer设计模式的意义。
刚刚提到委托是一个类,继承自 System.MulticastDelegate,MulticastDelegate 又继承自 System.Delegate。.NET 中与委托息息相关的概念——事件。C#在语法上对委托链的支持。
在C#中,编译器为委托类型提供了+=和-=两个操作符的重载,分别对应 Delegate.Combine 和
Delegate.Remove 方法,即是绑定(+=) 和移除(-=)定义委托的关键字:delegate;
OK,大概应该了解什么是委托后,来写一个测试案例,更加深刻的理解其中的奥妙;模拟一个场景:我们程序有一个功能:对某某人问好;这个功能需要面向国际化,国际化就需要支持多语言;是不是感觉实现起来so easy!
大部分可能会这么写,在没认识委托之前是这么实现:定义一个枚举主要是放语言的类型:
public enum Language{English, Chinese}
然后就是用switch啦!根据对应语言对号入座:当我使用英语的时候调用EnglishGreeting()方法,当我使用的是中文的时候调用ChineseGreeting()方法;
public void Getlanguage(string name, Language lang){
swith(lang){case Language.English:EnglishGreeting(name);break;
case Language.Chinese:ChineseGreeting(name);break;}}
两个方法分别是来自各种语言的输出:Console.WriteLine("早上好, " + name);
如期的在控制台应用程序中打印出 “早上好,XXX”
好了,功能尽管已经实现了,尽管这样已经能解决当前的问题了,但我们很容易就想到,这个程序可扩展性很差劲,如果之后需求上有增加了韩语,日语...我们将要不停的修改 枚举Language,不断往上添加,还有调整Getlanguage()中的swith;不断的添加判断条件;So,这种情况作为强迫症的我们必须去改进!
在使用委托之前,我们看看Getlanguage方法的签名,传入的是两个参数,一个是name,控制其姓名,一个是Language 枚举,控制其语言所属;这个时候,如果能把语言的输出方法当作参数来传,是不是就节省了一大截代码呢,这个时候就是委托出场的时候了;
定义一个委托delegate 方法:
public delegate void GreetPeople(string name);
然后就是语言的输出方法:
public static void GetChinese(string name)
{Console.WriteLine(name + " 你好!");}
public static void GetEnglish(string name)
{Console.WriteLine(name + " how do you do");}
最后公共的GetGreetPeople方法,这里把GreetPeople方法当作参数传入
public static void GetGreetPeople(string name, GreetPeople greetPeople)
{greetPeople(name);}
我们在static void Main()中调用这个方法,让其在控制台应用程序中输出:
GetGreetPeople("张三", GetChinese);
GetGreetPeople("Mr Zhang", GetEnglish);
Console.ReadKey();
显而易见,我们如期的在面板上看到了打印出来的文字:张三,你好!Mr Zhang,how do you do
或者这么用,用+=操作符进行一个方法的绑定:
GreetPeople greetPeople;
greetPeople = GetChinese;
greetPeople += GetEnglish;
greetPeople("Mr Zhang");
从而看出,委托从扩展性,代码的整洁度都有了大大的提升,对一些设计模式,如ObServer模式中奠定的基础
C# 6.0中可空类型
在C#编程中,我们可能会经常性的看到System.NullReferenceException:“未将对象引用设置到对象的实例报错,结合标题我们用一个控制台应用程序的TesDemo来加以验证,在C#6.0引用的可空类型的写法;
定义一个Pstu类:里面有三个属性:Name,Age,Sex
class PStu
{
public string Name { get; set; }
public int Age { get; set; }
public string Sex { get; set; }
}
然后我们要做的就是在控制台中输出PStu的Name:
PStu pStu = null;
Console.WriteLine(pStu.Name);
当然这个是存在报错的,因为Pstu是一个Null值;但我们要的就是这个效果:
想解决这个报错,就再简单不过了
1. 往往就一个if判断,pStu不为Null,name有值的情况下我们再去输出;
2. 或者你还可以用三元运算符去写: Console.WriteLine(pStu == null ? "" : pStu.Name);
3. 在C#6.0增加了可哦那个类型之后,大大的减少了我们的代码量
我们只需要这么做即可轻松的排除这个错误:再也不用写语句判断了:
就一个简答的问号,如下
Console.WriteLine(pStu?.Name);
以上便是可控类型的用法;