2013-10-18 161 views
16

我只是想知道是什麼樣的兩個下語句之間的區別:爲什麼空語句ToString()返回一個空字符串?

  1. 導致一個NullReferenceException - 這是確定。

    object test1 = default(int?); 
    object result = test1.ToString(); 
    
  2. 返回一個空字符串「」,爲什麼?

    object test2 = default(int?).ToString(); 
    
  3. 這是一樣的2

    int? test3 = null; 
    if (test3.ToString() == string.Empty) //returns true 
    { 
        Console.WriteLine("int? = String.Empty, isn't it strange?"). 
    } 
    
  4. 而只是爲了好玩 - 我可以證明,布爾可以等於int值(嗯怎麼布爾只能是虛假的,或真?和int永遠不會是)。

    if (default(int?).ToString() == default(bool?).ToString()) //returns true because both are empty strings 
    { 
        Console.WriteLine("int = bool"); 
    } 
    

注:(?INT)默認返回null。

+1

3中的「i」是什麼? – dotNET

+0

'Nullable '是一個值類型,實際上不能爲null。它只是用一種方式編程,以便'HasValue'屬性爲'false'時,與'null'的比較返回true。 (並將其設置爲'null'將設置'HasValue' proeprty爲'false') – dialer

+1

http://stackoverflow.com/questions/11446838/why-does-tostring-on-a-null-string-cause-a -null-error-when-tostring-works?rq = 1 – usha

回答

28

一個int?Nullable<int>Nullablestruct,它使它成爲值類型,而不是引用類型。 test3實際上未設置爲null。分配null它實際上會導致建立一個新的結構,它只是具有結構集合的HasValue領域false,而不是true的。 (特殊的編譯器需要支持這樣的隱式轉換髮生,所以你不能有自己的MyNullable<T>類型這樣做。)

由於可空物體具有實際價值,它可以調用ToString並提供有意義的值,在這種情況下,是一個空字符串。

當你框,通過把它在object變量空值將導致實際null值存儲在該變量,這就是爲什麼你調用它的方法時得到NRE。

當空值類型是盒裝它不框中的空值類型;相反,如果它沒有任何價值,它將null分配給對象,如果它有一個值,那麼該基礎值將被解包並裝箱。 (此行爲需要運行時的特殊支持,這是您無法自行創建類型的另一個原因)。

1

在C中,使用令牌.訪問左操作數的成員,並且->訪問左操作數保存指針(引用)的對象的成員。如果->的左側操作數爲空,則會發生空引用。在C#中,.在應用於值類型時具有前者的含義,而在應用於類類型時具有後者的含義;在C#中使用.類型變量爲null將觸發NullReferenceException

.NET類型Nullable<T>是一個兩字段結構,其中包含布爾字段,它指示它是否具有有意義的(非空值)值,並且值字段類型爲T以說明該值是什麼(如果不爲空) 。儘管編譯器允許將Nullable<T>賦值爲null或將其與空值進行比較,但前一種情況下的null實際上只是默認實例的簡寫(其中「has-value」標誌爲false,值字段保存類型T的缺省值),並且與null的比較實際上只是檢查HasValue屬性(它依次查看Boolean字段)的簡寫。在例如ToString上調用。 「空」的Nullable<int>在語義上與在包含分別具有值False0BooleanInt32的任何其他結構上調用它沒有不同。編譯器有幾種「特殊」對待可空類型的方法,但缺省值Nullable<int>包含[False, 0],而不是空引用。

請注意,第一個示例是因爲框架應用於可空類型的「特殊」規則之一而引發的。將值類型轉換爲Object或另一個引用類型通常指示運行時創建一個對象,該對象將表現爲類對象,其中的字段和成員與結構中的字段和成員相匹配,並返回對該新對象的引用 - 一種稱爲「裝箱」的過程」。因爲可爲空的類型的設計者希望允許代碼說if (NullableThing == null)而不是(恕我直言,在seho更清晰)if (!NullableThing.HasValue),運行時的實現是爲了裝填一個可爲null的空字段爲空將產生一個空引用,而不是對默認值的引用,價值實例Nullable<T>。雖然我認爲在某些情況下,某些值類型使用不同的box和unbox方法是有意義的,但可以使用空類型是唯一可以使用正常裝箱以外的任何類型的方法。

+2

這個解釋是正確的,但不完整:它不能解釋爲什麼它在第一種情況下拋出......這是因爲一個「空」可空對象被裝箱到一個空引用。 –

相關問題