2009-10-09 65 views
0

我在幾個使用if(Is.NotNull(SomeObject))而不是if(SomeObject!= null)的項目中遇到了一些代碼。這兩種方法有什麼區別嗎?什麼時候會使用某種特定的方法,還是隻是一種風格選擇?Is.NotNull和!= null之間的區別

回答

5

我看過Is.Not.Null作爲NUnit的一部分,以及來自Rhino.Mocks的Is.NotNull

通常功能不會有任何不同 - Is.NotNull的缺點只是爲了更「流利地」表達您的單元測試,或者自然地表達。關於測試的可讀性已經有很多討論,流暢的語法背後的想法是,當你從左到右閱讀時,它會形成一個描述代碼行正在做什麼的句子。

+0

有趣...我懷疑這是它創建的原因,但也許它不應該放在System命名空間中。感謝您的洞察力。 – tbreffni 2009-10-09 14:49:01

+0

我同意...... NUnit版本非常煩人。如果你一起使用NUnit和Rhino,它就不得不完全限定一切。 – womp 2009-10-09 15:47:08

4

您示例中的Is類型不是我之前在基類庫中見過的類型。這聽起來像是某人在貴公司或其他地方寫的東西,或許是「流利」圖書館的一部分。

4

還有可以會有細微的差別,如果SomeObject表達式的編譯時間類型已經重載!=。我希望希望儘管如此,假設一切都已經得到合理實施,那麼它最終不會有什麼區別。

雖然很難確切地知道這裏發生了什麼,因爲Is.NotNull不是基本類庫的一部分,據我所知...這些項目是否使用其他實用程序庫?這些是在單元測試還是生產代碼?

+0

啊,你說得對,它不是基類庫的一部分,它是我們在這裏定製的外部程序集的一部分。該方法是在System名稱空間中的一個名爲「Is」的類中實現的,因此導致它認爲它是BCL的一部分。謝謝你的幫助! – tbreffni 2009-10-09 14:45:00

0

例如,您可能需要查看Is.NotNull(),看它是否在對象的內部查找以確定是否設置了任何值。

這可能是一個對象由於更多的原因被認爲是空的,而實際上是空的(或未設置)對象值。這可能是因爲如果某些屬性未設置必須設置,那麼它也將被視爲空。

1

可能有區別。如果SomeObject有一個等號/不等於超載可能就不會被稱爲出於同樣的原因這兩個語句是不同的:

if(x == null) ... 

- 或 -

if(((object)x) == null) ... 

後者將使用引用相等,而前者可能會使用操作員超載。

相關問題