簡體   English   中英

在c#值類型或引用類型中為null

[英]Is null in c# value type or reference type

本來我有這樣的印象,NULL是引用類型,因為它被賦值給引用,然后遇到這個概念稱為可空值類型,這使得我的理論處於尷尬的境地,那么地球上的NULL值類型的引用類型呢?

C#規范在這一點上很清楚: null關鍵字表示沒有類型表達式 它既不是引用類型,也不是值類型,也不是指針類型。 但是,該表達式可以轉換為所有這些類型。 不要求編譯器將所有表達式分類為具有類型,實際上並非如此。

現在,您可以在運行時詢問空引用的類型是什么,可空值類型的空值的類型是什么,以及空指針的類型是什么。 答案是:

  • null引用沒有類型。 如果你有一個可以裝巧克力的盒子,那么問這個空盒子里的巧克力是什么牌子是毫無意義的。“ 缺少的巧克力沒有品牌; null引用沒有類型。

  • 類似地,空指針的類型也不是任何東西; 空指針值不指向任何內容。 如果你有一張地址為1600賓夕法尼亞大道的紙,你可以問“這個地址的房子顏色是什么”,並得到答案:白色。 如果你有一張白紙,詢問那個地址的房子顏色是什么,不能得到任何有用的答案。

  • 可空值類型的空值是可空值類型的值。

null不是一種類型。

來自msdn

null關鍵字是表示空引用的文字,不引用任何對象。

" 可空類型Nullable<T>結構的實例,“ ”。

都不是。 null是引用類型的default值,但它本身沒有類型。

Nullable值類型實際上是作為值類型本身實現的 - 只有編譯器和庫技巧才能使它們與null相比具有預期的行為。

null在C#中沒有自己的類型,因為這里已經說過了。 我認為其他答案中缺少一些顯示這一定義含義的精確例子。

var something = null;

是無效的

string a = null; // valid. Null is implicitely casted to string.
int? b = null; // valid. Null is implicitely casted to Nullable<int>.
var c = "hello" // valid, type of c is infered by the compiler by looking at the right side of the expression.

var d = null; // not valid, compiler can't infer any type from null !

上例中的無效行將導致以下編譯錯誤:

錯誤 - CS0815 - 無法分配給隱式類型的變量

並且 :

將null傳遞給重載方法可能需要顯式強制轉換

void myMethod(int? myParam) { }
void myMethod(string myParam) { }

void test 
{
    string a = null;
    myMethod(a); // no problem here, a is of type string so 2nd overload will be used.

    myMethod(null); // not valid ! Compiler can't guess which one you want.

    myMethod((string) null); // valid, null is casted to string so 2nd overload is to be used.
}

上例中的無效行將導致以下編譯錯誤:

錯誤 - CS0121 - 以下方法或屬性之間的調用不明確:'myMethod(string)'和'myMethod(int?)'

null不引用任何內容。 這只是一種無所事事的類型。 您通常使用它來取消引用對象。

C#中的null關鍵字確實表示空引用,因此您可以將其視為引用類型(盡管從技術上講它表示不是類型)。

C#編譯器和null額外處理與可空類型一起使用。 可以為Nullable的值類型和值類型,實際上永遠不能為null 將Nullable值類型賦值或比較為null ,編譯器將替換代碼。

例如:

int? i;
if (i == null)
    i = 1;

由編譯器替換為:

int? i;
if (!i.HasVaue)
   i = 1;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM