C# null,string.Empty,"",DBNull 的區別

【null】c++

null 在C# 中是一個關鍵字,表示不引用任何對象的空引用的文字值。 null 是引用類型變量的默認值。 普通值類型不能爲 null。數據庫

null 在 VS 中定位不出來具體是怎麼定義的。通常經過類名映射過來的關鍵字,均可以定位到聲明位置。因此null是比較特殊的。編程

這個東西要跟蹤源頭還比較麻煩,感受找不到具體定義。api

MSDN上說明很簡單:null 關鍵字是表示不引用任何對象的空引用的文字值。 null 是引用類型變量的默認值。 普通值類型不能爲 null。安全

stock overflow 上有一段回答:app

There are three things in C# that "null" can be. A reference, a pointer, and a nullable type.編程語言

The implementation of C# on the CLR represents a null reference by zero bits. (Where the number of bits is the appropriate size to be a managed pointer on the particular version of the CLR that you're running.)函數

Unsurprisingly, a null pointer is represented the same way. You can demonstrate this in C# by making an unsafe block, making a null pointer to void, and then converting that to IntPtr, and then converting the IntPtr to int (or long, on 64 bit systems). Sure enough, you'll get zero.性能

如下翻譯(來自Google在線翻譯):優化

C#中有三個「null」能夠。 引用,指針和可空類型。

CLR上的C#實現表示零位的空引用。 (其中位數是適合您正在運行的CLR的特定版本上的託管指針的大小。)

不出所料,空指針以相同的方式表示。 您能夠在C#中經過建立一個不安全的塊,將空指針轉換爲void,而後將其轉換爲IntPtr,而後將IntPtr轉換爲int(或64位系統上的long)來證實這一點。 果真,你會獲得零。

Stack Overflow 上的這個回答是基本從比較底層說明的。

那麼我們也從相對比較底層看下c/c++中null的定義。

來自 https://zh.cppreference.com/w/c/types/NULL 

C:

 

C++ 

 

【string.Empty】

這個是 string 類中的一個制度靜態變量。也就確定的說明了 string.Empty 是一個存在靜態對象。這個就跟 null 區別開了。那到底具體是個什麼呢?

string.Empty 其實就是 「」。

MSDN解釋:

https://docs.microsoft.com/zh-cn/dotnet/api/system.string.empty?view=netframework-4.7.2

 

string.Empty 雖然跟 「」 是相等的,可是通常在給 string 初始化爲空字符串的時候,通常建議用string.Empty,由於「」在賦值給string對象的時候,是你新建立了一個空字符串,而用Empty是將你的字符串對象指向了全局的只讀的空字符串,這樣相對來講性能能優化一些。

 

【「」】

 「」 表明一個空字符串。什麼意思,首先是一個字符串對象,可是特殊的是,這個字符串沒有內容,這可絕非 null。

 

我的經驗簡單形容下 null 和 「」。引用類型比如書目錄,類對象比如書中內容。若是引用類型不爲null,那麼目錄後面就有頁碼,若是爲null,那麼目錄後面的頁碼就爲0或者沒有頁碼。那麼沒有頁碼,你說這個目錄怎麼找頁數,也就是空引用了。 

 

【DBNull】

 咱先看MSDN註解:

DBNull類表示不存在的值。 例如,在數據庫中,表的行中的列不可能包含任何數據。 也就是說,列被視爲根本不存在,而不是隻是不具備值。 一個DBNull對象都表示不存在的列。 此外,COM 互操做使用DBNull類,以區分 VT_NULL 變體,用於指示不存在的值和 VT_EMPTY 變體,用於指示未指定的值。

DBNull類型是一個單一實例類,這意味着只有一個DBNull對象存在。 DBNull.Value成員表示單獨DBNull對象。 DBNull.Value 可用於顯式將不存在的值分配到數據庫字段中,儘管大多數的 ADO.NET 數據提供程序自動分配的值DBNull字段沒有有效的值。 您能夠肯定從數據庫字段中檢索某個值是否DBNull經過將爲該字段的值傳遞值DBNull.Value.Equals方法。 可是,某些語言和數據庫對象提供一些方法,使其更輕鬆地肯定數據庫字段的值是否爲DBNull.Value。 其中包括 Visual BasicIsDBNull函數,Convert.IsDBNull方法,DataTableReader.IsDBNull方法,和IDataRecord.IsDBNull方法。

不要混淆這一律念null在面向對象的編程語言與DBNull對象。 在面向對象的編程語言中,null表示不存在的對象的引用。 DBNull 表示一個未初始化的變量或不存在的數據庫列。

 

從上面註解能夠看出,DBNull只要用在數據庫和COM互操做中。而DBNull中有個Value字段,這個字段是一個靜態只讀字段,也就是全局惟一靜態DBNull對象,不是null。

當咱們在用ADO.NET操做數據庫時,遇到數據庫返回字段值爲NULL時,就須要用DBNull來判斷,而不能用null來判斷。

看看MSDN對DBNull.Value的註解:

DBNull 是一個單一實例類,這意味着能夠存在此類的此實例。

若是數據庫字段有缺失數據,則可使用DBNull.Value屬性來顯式分配DBNull對象的字段的值。 可是,大多數數據訪問接口自動執行此操做。

若要評估的數據庫字段,以肯定它們的值是否DBNull,能夠將傳遞到的字段值DBNull.Value.Equals方法。 可是,不多使用此方法,由於有多種其餘方法來評估缺乏數據的數據庫字段。 其中包括 Visual BasicIsDBNull函數,Convert.IsDBNull方法,DataTableReader.IsDBNull方法,IDataRecord.IsDBNull方法和其餘幾種方法。

因此這下就明白了吧,這就是爲何咱們用IDataReader讀取數據庫字段信息時,要用DBNull.Value來判斷是否爲空,而後在轉換或者其餘操做。

https://docs.microsoft.com/zh-cn/dotnet/api/system.dbnull.value?view=netframework-4.7.2

相關文章
相關標籤/搜索