C#委托和C# 6.0中可空类型

本文介绍了C#中的委托概念,它允许将方法作为参数传递,增强了代码的可扩展性和避免了大量条件判断。通过一个国际化的问候场景,展示了如何使用委托简化代码。此外,文章还探讨了C# 6.0引入的可空类型特性,如何在可能为null的对象上调用属性或方法时避免NullReferenceException,以及如何简洁地处理这种情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是委托?在.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);

以上便是可控类型的用法;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值