【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