您好,登錄后才能下訂單哦!
本篇內容主要講解“C#可空引用類型怎么使用”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“C#可空引用類型怎么使用”吧!
您必須下載Visual Studio 2017 15.5預覽版(目前最新發布版本是15.4)
安裝Roslyn擴展預覽版本:
下載并解壓 Roslyn_Nullable_References_Preview.zip [最新版本 11/15/17];
關閉所有運行的Visual Studio;
運行zip根目錄中的 .\install.bat 腳本(如果需要卸載擴展,可以運行.\uninstall.bat腳本);
在語法上,可為空引用類型與可為空值類型使用的語法是一致的,在類型后面追加 ? 即可。
class Person { public string FirstName; public string? MiddleName; public string LastName; }
我們都知道當初微軟在增加可為空值類型的時候,實際是在框架中增加了System.Nullable<>
類型,您肯定會問,可為空引用類型以框架中又增加了什么新的類型。
我們來看一個演示:
class Program { static void Main(string[] args) { Console.WriteLine(typeof(string?).FullName); } }
輸出結果:
您是否覺得奇怪,怎么輸出的是System.String
,是的,其實微軟在框架中沒有加入任何類型,我們Person
類型進行編譯后,再通過dotPeek進行反編譯,就明白到底發生了什么。
反編譯后的結果:
internal class Person { public string FirstName; [Nullable] public string MiddleName; public string LastName; }
只是在MiddleName
字段上增加了System.Runtime.CompilerServices.NullableAttribute
標記。
我們來看一看屬性、參數、變量、返回值編譯之前與編譯之后的比對結果。
屬性
// 編譯前: public string? MiddleName { get; set; } // 編譯后: [Nullable] public string MiddleName { [return: Nullable] get; [param: Nullable] set; }
參數
// 編譯前: public Person(string? middleName ) { this.MiddleName = middleName; } // 編譯后: public Person([Nullable] string middleName) { this.MiddleName = middleName; }
返回值
// 編譯前: public string? DoSomething() { return null; } // 編譯后: [return: Nullable] public string DoSomething() { return (string) null; }
變量
// 編譯前: string? name; // 編譯后: string name;
這里除了變量,其它的都使用了NullableAttribute
標記進行的修飾。
通過上面的章節,我們知道,可為空引用類型只是在參數、屬性、參數和返回值中使用NullableAttribute
標記進行修飾,實際上對程序的正常運行沒有任何的影響。那么它可以為我們做什么呢?
在C#中不能表達這個變量、參數、字段、屬性,返回值等可能為null
或不能為null
,可為空類型可以幫我們解決這個問題。
class Person { public string FirstName; // 不為null public string? MiddleName; // 可能為null public string LastName; // 不為null }
這個類型的可以表示每一個人都應該 FristName 和 LastName ,但是不是每一個人都應該有 MiddleName。
可為空引用類型的另一個好處是編譯器可以幫助我們檢測代碼,比如對于直接使用可為空引用類型的屬性,編譯器會發出警告。
void M(Person p) { p.FirstName = null; // 1 WARNING: Cannot convert null to non-nullable reference。 p.LastName = p.MiddleName; // 2 WARNING: Possible null reference assignment. string s = default(string); // 3 WARNING: Cannot convert null to non-nullable reference。 if (p.MiddleName != null) { WriteLine(p.MiddleName.Length); // ok } WriteLine(p.MiddleName!.Length); // ok } class Person { public string FirstName; // 4 WARNING: Non-nullable field 'FirstName' is uninitialized. public string? MiddleName; public string LastName; // 5 WARNING: Non-nullable field 'LastName' is uninitialized. }
編譯器會幫我們做以下幾點檢測:
如果給非可為空引用類型賦null
值或可為空引用類型的值,則會發出警告;
如果直接使用可為空引用類型,則會發出警告;
如果從來沒有給非可為空引用類型的屬性賦值,則會發出警告;
如果需要直接使用可為空引用類型,需要使用 ! 符號告訴編譯器,您已經確認過該值不可能為空。
當然這只是編譯器的行為,可以禁用與之相關的警告提示。
到此,相信大家對“C#可空引用類型怎么使用”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。