2011-02-28 40 views
0

我真的不喜歡調用String.IsNullOrEmpty(str)。這讓我需要首先思考「String」類,然後在對象「str」上調用它。接受null的擴展方法的可接受名稱

我喜歡調用str.IsNullOrEmpty(),它不需要我去思考「String」類。

問題是擴展方法接受null實例來調用,這不是當您調用普通方法時通常的情況。

我的問題你認爲接受null的擴展方法的對稱名稱是什麼?

  1. 對於字符串,這很容易, 「IsNullOrEmpty()」(任何包含 「ISNULL」)的聲音對我好。

  2. 對於其他人,比如GetDisplayName(),我們是否將其命名爲「NullOrGetDisplayName」?

回答

1

如何NullSafeGetDisplayNameGetDisplayNameNullSafe,表示這是它的安全調用,即使它被稱爲上的對象是null

0

Nullable類有一個名爲GetValueOrDefault的方法。相同的形式可用於某些擴展方法:GetDisplayNameOrDefault或可能更具體的GetDisplayNameOrNullGetDisplayNameOrEmpty

+0

我對此有疑問。例如,((string [])arStr).FirstOrDefault()也使用「Default」關鍵字,但在空實例上調用該方法並不安全。 – GaryX 2011-02-28 23:20:13

1

我會爲mystring.IsNullOrEmpty()尋找可以查詢「空」對象的方法 - 顯然它會檢查字符串是否爲空,並且只要您與整個代碼庫中的命名一致,沒有人會理解任何問題/學習它的意思。

有關適用的東西的對象,忽略空的對象,我會使用「安全」,如SafeGetDisplayName()方法 - 這是一種常見的長期使用的標準(CF GetSafeHandle()的MFC)

2

首先,你的想法是錯誤的,你應該調整它。考慮在空對象上調用方法是不正確的;確實這就是爲什麼你想看看它是否爲空的原因!其次,一種方法意味着它在它所具有的參數中接受空值。我不認爲命名約定在這裏是適當的。您可能可以通過例如Spec#消除類中的空值。

+0

Thx爲您解答。 Spec#我什麼都不知道。它現在準備好使用了嗎?另外,你的意思是我應該保持舊的方式來使用String.IsNullOrEmpty(str)並在實際環境中遭受一些不便(我認爲完全可以做安全/防禦性編程,而不是方便編程)? – GaryX 2011-02-28 23:23:24

+0

實際上,您可能可以通過代碼合同執行相同的操作:http://research.microsoft.com/en-us/projects/contracts/我認爲(不確定)包含在最新版本的東西中( .NET 4或VS 2010或類似軟件)。我想是的,你應該承受一些不便,以確定你是否應該考慮消除空(這將是更多的工作)。 FWIW,它需要1秒鐘的時間才能輸入'string.IsNullOrEmpty(foo)',並且通常在此基礎上,我做了一些「很好」的事情(報告錯誤,不管)。所以我一般不認爲它是浪費的。 – 2011-02-28 23:37:06

+1

很多人認爲,在一個空物體上打一個電話是「邪惡的」,但只要對呼叫者清​​楚它意味着什麼*,它就非常優雅和安全。在計算機編程中使用「nulls」有很長的歷史(例如,當你想刪除它時將數據管道到/ dev/null,在SQL中NULL可以被認爲是數據庫條目是「空的」),並且它是與集合的自然匹配:將「if(collection!= null && collection.Count> 0)」的優雅/可讀性與「if(collection.IsEmpty)」的優雅/可讀性進行比較。意思是否令人困惑?我認爲空集合直觀地必須是空的。 – 2011-02-28 23:48:18

1

我只是不明白你在這裏的思維方式。寫一些類似於nullObject.IsNullOrWhatever()的東西根本沒有任何意義。你可能會也可能不喜歡這個靜態表單,但是你的解決方案對我來說確實是錯誤的。

+0

? – GaryX 2011-02-28 23:26:29

+1

問題是調用空對象上的函數。語言讓你做某事的事實並不總是意味着它是正確的。 bool result =(str!= null)&& str.AskWhateverYouLike()是每個人都會理解的東西。你的解決方案會讓人們撓頭,直到他們意識到發生了什麼。這就像喝水,以確定我是否渴了。 – Trap 2011-02-28 23:53:45