掃二維碼與項目經(jīng)理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
請先看下面的代碼

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

我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流