<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
您必須下載Visual Studio 2017 15.5預覽版(目前最新發布版本是15.4),下載地址:https://www.visualstudio.com/en-us/news/releasenotes/vs2017-preview-relnotes。
安裝Roslyn擴充套件預覽版本:
在語法上,可為空參照型別與可為空值型別使用的語法是一致的,在型別後面追加 ? 即可。
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#新特性之可空參照型別的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45