[英]Is null in c# value type or reference type
本來我有這樣的印象,NULL是引用類型,因為它被賦值給引用,然后遇到這個概念稱為可空值類型,這使得我的理論處於尷尬的境地,那么地球上的NULL值類型的引用類型呢?
C#規范在這一點上很清楚: null
關鍵字表示沒有類型的表達式 。 它既不是引用類型,也不是值類型,也不是指針類型。 但是,該表達式可以轉換為所有這些類型。 不要求編譯器將所有表達式分類為具有類型,實際上並非如此。
現在,您可以在運行時詢問空引用的類型是什么,可空值類型的空值的類型是什么,以及空指針的類型是什么。 答案是:
null引用沒有類型。 如果你有一個可以裝巧克力的盒子,那么問這個空盒子里的巧克力是什么牌子是毫無意義的。“ 缺少的巧克力沒有品牌; null引用沒有類型。
類似地,空指針的類型也不是任何東西; 空指針值不指向任何內容。 如果你有一張地址為1600賓夕法尼亞大道的紙,你可以問“這個地址的房子顏色是什么”,並得到答案:白色。 如果你有一張白紙,詢問那個地址的房子顏色是什么,不能得到任何有用的答案。
可空值類型的空值是可空值類型的值。
都不是。 null
是引用類型的default
值,但它本身沒有類型。
Nullable值類型實際上是作為值類型本身實現的 - 只有編譯器和庫技巧才能使它們與null
相比具有預期的行為。
null
在C#中沒有自己的類型,因為這里已經說過了。 我認為其他答案中缺少一些顯示這一定義含義的精確例子。
是無效的
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 - 無法分配給隱式類型的變量
並且 :
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.