自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

C#中使用擴(kuò)展方法對(duì)調(diào)用進(jìn)行驗(yàn)證

開發(fā) 后端
利用C# 3.0提供的擴(kuò)展方法技術(shù),可以為已經(jīng)編譯好的程序集類型增加新的方法,從而應(yīng)對(duì)新的擴(kuò)展。除了在可擴(kuò)展性方面所具有的優(yōu)勢(shì)之外,如果能夠合理地結(jié)合泛型與類型推斷,擴(kuò)展方法還可以有效降低代碼的重復(fù),提高程序的可重用性。

請(qǐng)先看下面的代碼

{
   publicIEnumerable FindCustomers(stringroleName)
   {
       returnfrom customer
            incontext.Customer
             where customer.RoleName.Equals(roleName)
             select customer;
   }
}

當(dāng)方法返回的結(jié)果為null時(shí),采用如下方式進(jìn)行調(diào)用,就會(huì)拋出NullReferenceException異常:

Customer customer =newCustomerDAL().FindCustomers(Role.Admin).First();

我們需要對(duì)返回結(jié)果進(jìn)行驗(yàn)證,如果返回為null,則可以拋出自定義異常,或者創(chuàng)建一個(gè)空對(duì)象,例如:

publicIEnumerable FindCustomers(stringroleName)
{
    IEnumerable customers = from customer
            incontext.Customer
             where customer.RoleName.Equals(roleName)
             select customer;
   if(customers ==null)
   {
       thrownewMyException("Cann't find the customers.");
   }
   returncustomers;
}

如果系統(tǒng)有許多方法都需要對(duì)返回結(jié)果進(jìn)行驗(yàn)證,則這樣的驗(yàn)證邏輯就會(huì)充斥在各個(gè)方法體中,既不利于重用,也會(huì)對(duì)未來的修改造成極大的阻礙。當(dāng)然,我們可以引入Null Object模式來替代對(duì)null值的判斷邏輯,但這種方式仍然需要為多種類型定義不同的Null Object類型。

Craig Andera在其博客文章中提出使用擴(kuò)展方法對(duì)調(diào)用進(jìn)行驗(yàn)證。他寫道:NullReferenceException異常會(huì)拋出,但是我們希望有更具體的異常信息。因此,我們編寫了如下的擴(kuò)展方法:

publicstaticT OrThrow(thisT obj, Exception e){
   if(obj ==null){
       throwe;
   }
   returnobj;
}
利用OrThrow擴(kuò)展方法,則之前的調(diào)用方式可以修改為:

Customer customer =newCustomerDAL().FindCustomers(Role.Admin).OrThrow(newMyException

("Can't find Customer")).First();

OrThrow擴(kuò)展方法對(duì)于你所要調(diào)用的類型而言是通用的,并且它返回了該類型,所以你可以將其插入到表達(dá)式鏈中,而不會(huì)丟失智能感應(yīng)功能。并且因?yàn)轭愋屯茢喙δ?,?shí)際上并不需要指定具體的類型。

也就是說,OrThrow擴(kuò)展方法可以應(yīng)用到任何類型上,因此它可以在各種類型上重用非空驗(yàn)證甚至是調(diào)用驗(yàn)證。借鑒這一思想,我們還可以利用此方法默認(rèn)實(shí)現(xiàn)對(duì)象實(shí)例的創(chuàng)建,以避免拋出NullReferenceException異常,例如:

publicstaticT Instance(thisT obj) where T:new()
{
   if(obj ==null)
   {
        bj =newT();
   }

   returnobj;
}

由于Instance擴(kuò)展方法中的類型參數(shù)T需要?jiǎng)?chuàng)建實(shí)例,因此必須添加new()約束。所以該擴(kuò)展方法存在一定的局限,例如無法應(yīng)用在之前的IEnumerable類型上。但對(duì)于如下的方法卻非常有效:

publicclassListObject
{
   publicList Foo()
   {
       returnnull;
   }
}

通過Instance擴(kuò)展方法,可以安全地調(diào)用List的相關(guān)屬性和方法,例如Count屬性:

Console.WriteLine(newListObject().Foo().Instance().Count);

控制臺(tái)打印出來的結(jié)果為0。如果沒有Instance擴(kuò)展方法,則會(huì)拋出NullReferenceException異常。

作為C# 3.0增加的新特性,擴(kuò)展方法在大量項(xiàng)目中得到了廣泛地應(yīng)用,但絕不僅僅是提高可擴(kuò)展性這么簡(jiǎn)單。在進(jìn)行項(xiàng)目開發(fā)時(shí),若能適當(dāng)?shù)乜紤]使用擴(kuò)展方法,說不定會(huì)帶來出奇制勝的效果。

【編輯推薦】

  1. 詳解C#代碼文件生成擴(kuò)展代碼文件
  2. 深入理解C# 3.0的五項(xiàng)主要改進(jìn)
  3. 淺析C#編程中的內(nèi)存管理
責(zé)任編輯:彭凡 來源: ITPUB個(gè)人空間
相關(guān)推薦

2009-09-01 11:04:59

C#調(diào)用擴(kuò)展方法

2009-08-31 14:45:10

C#擴(kuò)展方法

2009-08-10 17:36:17

C#擴(kuò)展方法

2009-08-27 18:04:01

c#擴(kuò)展方法string

2009-08-11 11:07:49

Java調(diào)用C# we

2009-08-31 18:05:14

C#調(diào)用WalkTre

2009-08-31 16:33:28

C#調(diào)用Dispose

2009-08-20 13:47:57

C#驗(yàn)證輸入方法

2021-01-28 05:14:40

C#接口簽名

2009-08-18 14:14:45

C#擴(kuò)展方法性能測(cè)試

2009-08-27 09:27:49

C#擴(kuò)展方法

2009-08-26 15:53:48

C#擴(kuò)展方法

2009-08-27 16:24:48

擴(kuò)展方法C# 3.0新特性

2009-08-03 12:57:27

C#調(diào)用DLL

2009-03-18 09:15:34

UndoRedoC#

2020-12-31 07:31:10

C# 反射數(shù)據(jù)

2009-09-11 10:59:06

Effective C調(diào)用Dispose()

2009-08-05 09:30:39

C#調(diào)用DLL函數(shù)

2009-08-26 16:58:12

調(diào)用C# Thread

2009-09-02 10:49:46

C#調(diào)用析構(gòu)方法
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)