2009-09-29 65 views
9

我喜歡可讀性。擴展方法 - IsNull和IsNotNull,好還是壞使用?

因此,我在幾分鐘前爲(x =!null)類型的語法(稱爲IsNotNull)提出了擴展方法。 Inversly,我還創建了一個ISNULL擴展方法,從而

if(x == null) becomes if(x.IsNull()) 

if(x != null) becomes if(x.IsNotNull()) 

不過,我擔心我可能會被濫用擴展方法。你認爲這是使用Extenion方法的不好之處嗎?

+0

這是一個很像http://stackoverflow.com/questions/790810/is-extending-string-class-with-isnullorempty-confusing – Vadim 2009-09-29 21:50:20

+7

這不是任何短,它的沒有更清楚。 – 2009-09-29 21:58:45

+0

+1帕維爾 - 好吧。 – 2009-09-29 22:28:19

回答

11

它似乎沒有任何更好的可讀性和可能混淆的人閱讀的代碼,不知道是否有他們不知道的任何邏輯那些方法。

我已經使用了一個PerformIfNotNull(Func方法)(以及一個採取動作的重載),我可以通過一個快速lambda表達式來替換整個if塊,但是如果除了檢查以外沒有其他任何操作對於null來說,它似乎沒有提供任何有用的東西。

2

這是完全有效的做,但我不認爲這是非常有用的。由於擴展方法僅僅是編譯器的詭計,所以我很難將它們的任何使用稱爲「濫用」,因爲它們無論如何都只是絨毛。當他們傷害可讀性時,我只會抱怨擴展方法。

2

已有先例,在儘可能的String類有IsNullOrEmpty

+2

是的,但是它的OrEmpty部分提供了額外的功能,這看起來好像增加了更多的輸入,沒有任何好處。 – Davy8 2009-09-29 21:43:33

+1

我個人喜歡IsNullOrEmpty,因爲它是'兩隻鳥一塊石頭'的方法。 – CmdrTallen 2009-09-29 21:44:08

+0

@ Davy8 - 好點 – 2009-09-29 21:48:23

1

您還介紹了某些CLR內部操作的方法調用開銷。 JIT可能會將其內聯,但它可能不會。這是一個微不足道的挑逗,但我同意這不是特別有用。當可讀性提高時,或者如果我想要一些其他行爲,比如「拋出ArgumentNullException並傳遞參數名」,這種做法很愚蠢,一次又一次地內聯,我會這樣做。

0

例如,假設你可能想要在x爲空時拋出一個異常(只需在擴展方法中執行它)就可以了。但是,我個人偏好在這種特殊情況下是明確檢查(空對象應該爲空:-))。

3

我沒有找到非常有用的,但這樣的:

someString.IsNullOrBlank() // Tests if it is empty after Trimming, too 
someString.SafeTrim()   // Avoiding Exception if someString is null 

,因爲這些方法實際上,您就無需做多項檢查。但用方法調用替換單個檢查對我來說似乎是無用的。

+4

'string.IsNullOrWhiteSpace'是.NET 4中的一種新方法(http://msdn.microsoft.com/zh-cn/library/system.string.isnullorwhitespace(VS.100).aspx)。 – 2010-03-08 07:06:10

+0

+1這太棒了! – Botz3000 2010-03-08 09:05:23

0

要遵循模式,它應該是一個屬性而不是一個方法(但當然,這不適用於擴展)。

System.Data命名空間中的數據值具有IsNull屬性,該屬性確定該值是否包含DbNull值。

DataRow類有一個IsNull方法,但它不確定DataRow是否爲null,它確定數據行中的某個字段是否包含DbNull值。

1

相反,我會去的東西,如:

static class Check { 
    public static T NotNull(T instance) { 
     ... assert logic 
     return instance; 
    } 
} 

然後使用它是這樣的:

Check.NotNull(x).SomeMethod(); 
y = Check.NotNull(x); 

個人是更清楚是怎麼回事,而不是聰明,並允許執行以下操作:

if(((Object)null).IsNull()) ... 
+0

我認爲這是不明確的,用戶應該如何記住Check.NotNull(x)將返回一個相同類型的實例!對我來說,當我讀取代碼中的Check.NotNull(x)時,我希望得到真/假結果。 – 2013-12-02 18:08:09

2

我並不完全同意「可能會混淆」的推理。

在某種程度上,我可以看到什麼是沒有理由在「共同理解」之外冒險 - 每個人都理解對象!= null。

但是在Visual Studio中,我們有很棒的工具,您只需將鼠標懸停在方法上即可顯示一些附加信息。

如果我們要說擴展方法註釋了一個很好的解釋,那麼我覺得混淆的論點分崩離析。

方法.IsNotNull()和.IsNull()完全解釋它們是什麼。我覺得他們非常合理和有用。

誠實地說,這是一個「你喜歡什麼」的問題。如果您覺得這些方法會使您的項目環境更具可讀性,那麼就去做吧。如果你在項目中違反慣例,那麼我會說相反。

我對這個問題有着同樣的想法,並且在我的工作地點問過幾位非常有經驗的開發人員。他們都沒有提出一個很好的理由(除了這裏提到的關於「混亂」的內容),這將解釋爲什麼你不應該這樣做。

去了:-)