C 8中的可空引用型別

2022-01-19 17:28:34 字數 3161 閱讀 4318

原文:nullable reference types in c# 8

可空引用型別

自從我開始學習.net, 引用型別一直就是可空的。然而初級程式設計師通常會告訴你值型別不可空,引用型別可空。

事實上,在.net中有一種語法可以表明乙個值型別是否可空。

int? nullableint1 = null;

nullablenullableint2 = null;

int nullableint3 = null; //編譯錯誤

並且這種語法並不只適用於原始型別,它也適用於struct

tips: struct本身就是值型別

struct mystruct

static void main(string args)

但是現在我們希望在編譯以下**時,編譯器能給出錯誤或者警告

class myclass

static void main(string args)

這裡我們第乙個問題就是,為什麼需要讓編譯器給出錯誤或者警告?

我們接下來已一段簡單的**為例。

class myclass

}

static void main(string args)

這個**是某個功能的最初版本,看起來非常的簡單,並且會執行的很好。

現在我們想象一下,一段之間之後,另外乙個程式設計師加入了專案,將程式修改如下

class myclass

}

static void main(string args)

...if(myclass == null)

...myclass.sayhello();

}

這樣的**看起來很傻,但是現實情況中確實會發生,有人會將myclass設定為null來滿足他們正在處理的功能。它深藏在程式中,甚至可以通過單元測試,所有的功能看起來都執行良好。

但是在某個特定的時間點, 特定的條件下,程式會丟擲乙個nullreferenceexception空引用異常, 這時候我們才會發現我們缺少了空引用判斷,然後新增一定的防護。

class myclass

}

static void main(string args)

...if(myclass == null)

...if(myclass != null)

}

那麼如何避免其他程式設計師,或者未來的自己,陷入這種空引用的陷阱呢?

如上所述,這裡我們首先需要使用c#8的nullable reference types功能。 完成後,只需要在專案的csproj檔案中新增一行:

true
就可以了。

一旦我們啟用了該功能,讓我們看一段簡單的**來說明它是如何工作的。

class myclass} 

static void main(string args)

如果編譯以上**的話,我們會得到2個警告。這裡我使用了加粗字型,是因為我們得到的只是警告,不是編譯錯誤。你的程式依然可以編譯和啟動。

第乙個警告是我們嘗試將null分配給未明確設定為允許空值的變數。

converting null literal or possible null value to non-nullable type.
第二個警告是當我們嘗試實際使用非可空型別時,編譯器認為它將為null。

possible dereference of a null reference.
所以這兩個警告都不會阻止我們的應用程式執行,但它會警告我們我們可能遇到麻煩。

下面讓我們修改**,讓我們的引用型別變數可空

c# 8中可用引用型別的定義於可空值型別一樣,即在宣告時,型別名的後面加?號

static void main(string args)

這裡有趣的是,修改完**後,編譯專案,你依然會收到possible dereference的警告。為了消除掉這個警告,你可以新增空引用檢查。

static void main(string args)

}

至此,所有的警告都消失了。

在我們實際編碼過程中,引用型別可以在方法,類,甚至程式集中傳遞。因此丟擲警告時,它並不是萬無一失的。例如,我們有如下**:

class myclass  

static void main(string args)

static void somemethod(myclass myclass)

這裡編譯器只會警告我們在分配乙個null值給乙個沒有明確指定可空的變數。但是我們不會得到possible dereference的警告。這裡我們可以推斷,一旦將物件傳遞到方法之外,無論在那裡發生什麼(如設定null),我們都不會被警告。但是如果我們在相同的**/方法塊中如此明確地分配null,然後嘗試使用它,那麼編譯器將嘗試給我們乙個幫助。

為了與上述**比較,以下**確實會收到2條警告

static void main(string args)

myclass.sayhello();

}

如果你希望用錯誤替換警告,你可以公升級整個檢查到嚴格模式。這裡你只需要在專案的csproj檔案中新增一行:

true
注意: 這會將所有警告視為錯誤,而不僅僅是關於空引用問題的警告。但這意味著如果有警告被丟擲,你的專案將不再編譯!

微軟在C 8中引入預覽版可空引用型別

微軟已經為開發者提供了預覽版的可空引用型別 nullable reference type 想嘗鮮的開發者可以嘗試這個新特性,並提供反饋。u0026 xd n u0026 xd n 預覽版可空引用型別是visual studio 2017 15.5 preview 4 的roslyn擴充套件,現在支...

微軟在C 8中引入預覽版可空引用型別

微軟已經為開發者提供了預覽版的可空引用型別 nullable reference type 想嘗鮮的開發者可以嘗試這個新特性,並提供反饋。預覽版可空引用型別是visual studio 2017 15.5 preview 4 的roslyn擴充套件,現在支援.net框架,很快也將支援.net cor...

微軟在C 8中引入預覽版可空引用型別

微軟已經為開發者提供了預覽版的可空引用型別 nullable reference type 想嘗鮮的開發者可以嘗試這個新特性,並提供反饋。預覽版可空引用型別是visual studio 2017 15.5 preview 4 的roslyn擴充套件,現在支援.net框架,很快也將支援.net cor...