新聞中心
請先看下面的代碼

創(chuàng)新互聯(lián)建站是一家專注于成都做網(wǎng)站、網(wǎng)站設(shè)計與策劃設(shè)計,達拉特網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)建站做網(wǎng)站,專注于網(wǎng)站建設(shè)10多年,網(wǎng)設(shè)計領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:達拉特等地區(qū)。達拉特做網(wǎng)站價格咨詢:18980820575
{
|
當(dāng)方法返回的結(jié)果為null時,采用如下方式進行調(diào)用,就會拋出NullReferenceException異常:
Customer customer =newCustomerDAL().FindCustomers(Role.Admin).First(); |
我們需要對返回結(jié)果進行驗證,如果返回為null,則可以拋出自定義異常,或者創(chuàng)建一個空對象,例如:
publicIEnumerable FindCustomers(stringroleName) |
如果系統(tǒng)有許多方法都需要對返回結(jié)果進行驗證,則這樣的驗證邏輯就會充斥在各個方法體中,既不利于重用,也會對未來的修改造成極大的阻礙。當(dāng)然,我們可以引入Null Object模式來替代對null值的判斷邏輯,但這種方式仍然需要為多種類型定義不同的Null Object類型。
Craig Andera在其博客文章中提出使用擴展方法對調(diào)用進行驗證。他寫道:NullReferenceException異常會拋出,但是我們希望有更具體的異常信息。因此,我們編寫了如下的擴展方法:
publicstaticT OrThrow(thisT obj, Exception e){
|
OrThrow擴展方法對于你所要調(diào)用的類型而言是通用的,并且它返回了該類型,所以你可以將其插入到表達式鏈中,而不會丟失智能感應(yīng)功能。并且因為類型推斷功能,實際上并不需要指定具體的類型。
也就是說,OrThrow擴展方法可以應(yīng)用到任何類型上,因此它可以在各種類型上重用非空驗證甚至是調(diào)用驗證。借鑒這一思想,我們還可以利用此方法默認(rèn)實現(xiàn)對象實例的創(chuàng)建,以避免拋出NullReferenceException異常,例如:
publicstaticT Instance(thisT obj) where T:new() |
由于Instance擴展方法中的類型參數(shù)T需要創(chuàng)建實例,因此必須添加new()約束。所以該擴展方法存在一定的局限,例如無法應(yīng)用在之前的IEnumerable類型上。但對于如下的方法卻非常有效:
publicclassListObject |
通過Instance擴展方法,可以安全地調(diào)用List的相關(guān)屬性和方法,例如Count屬性:
Console.WriteLine(newListObject().Foo().Instance().Count); |
控制臺打印出來的結(jié)果為0。如果沒有Instance擴展方法,則會拋出NullReferenceException異常。
作為C# 3.0增加的新特性,擴展方法在大量項目中得到了廣泛地應(yīng)用,但絕不僅僅是提高可擴展性這么簡單。在進行項目開發(fā)時,若能適當(dāng)?shù)乜紤]使用擴展方法,說不定會帶來出奇制勝的效果。
當(dāng)前文章:C#中使用擴展方法對調(diào)用進行驗證
分享路徑:http://www.5511xx.com/article/cdjdisc.html


咨詢
建站咨詢
