I am a passionate coder ^_^
可空引用类型? 自从我开始学习.NET,引用类型一直就是可空的。然而初级程序员通常会告诉你值类型不可空,引用类型可空。 事实上,在.NET中有一种语法可以表明一个值类型是否可空。 int? nullableInt1 = null; Nullable 并且这种语法并不只适用于原始类型,它也适用于struct
struct MyStruct { 但是现在我们希望在编译以下代码时,编译器能给出错误或者警告 class MyClass { <h1 id="为什么">为什么? 这里我们第一个问题就是,为什么需要让编译器给出错误或者警告? 我们接下来已一段简单的代码为例。 class MyClass { public void SayHello() { Console.WriteLine("Hello"); } } 这个代码是某个功能的最初版本,看起来非常的简单,并且会运行的很好。 现在我们想象一下,一段之间之后,另外一个程序员加入了项目,将程序修改如下 class MyClass { public void SayHello() { Console.WriteLine("Hello"); } } 这样的代码看起来很傻,但是现实情况中确实会发生,有人会将 但是在某个特定的时间点,特定的条件下,程序会抛出一个 class MyClass { public void SayHello() { Console.WriteLine("Hello"); } } 那么如何避免其他程序员,或者未来的自己,陷入这种空引用的陷阱呢? 如上所述,这里我们首先需要使用C#8的Nullable Reference Types功能。 完成后,只需要在项目的csproj文件中添加一行:
就可以了。 一旦我们启用了该功能,让我们看一段简单的代码来说明它是如何工作的。 class MyClass { public void SayHello() { Console.WriteLine("Hello"); } } 如果编译以上代码的话,我们会得到2个警告。这里我使用了加粗字体,是因为我们得到的只是警告,不是编译错误。你的程序依然可以编译和启动。 第一个警告是我们尝试将null分配给未明确设置为允许空值的变量。
第二个警告是当我们尝试实际使用非可空类型时,编译器认为它将为null。
所以这两个警告都不会阻止我们的应用程序运行,但它会警告我们我们可能遇到麻烦。 下面让我们修改代码,让我们的引用类型变量可空
static void Main(string[] args) { MyClass? myClass = null; myClass.SayHello(); } 这里有趣的是,修改完代码后,编译项目,你依然会收到 static void Main(string[] args) { MyClass? myClass = null; if (myClass != null) { myClass.SayHello(); } } 至此,所有的警告都消失了。 在我们实际编码过程中,引用类型可以在方法,类,甚至程序集中传递。因此抛出警告时,它并不是万无一失的。例如,我们有如下代码:
这里编译器只会警告我们在分配一个null值给一个没有明确指定可空的变量。但是我们不会得到 为了与上述代码比较,以下代码确实会收到2条警告 static void Main(string[] args) { MyClass myClass = new MyClass(); if (new Random().Next(1,10) > 5) { myClass = null; } <h1 id="启用可空引用类型的严格模式">启用可空引用类型的严格模式 如果你希望用错误替换警告,你可以升级整个检查到严格模式。这里你只需要在项目的csproj文件中添加一行:
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc – 如何构造VB.NET Windows窗体应用程序
- asp.net-mvc – 存储库模式:每个实体一个存储库类?
- asp.net-mvc – 使用razor引擎在mvc4中重写url
- asp.net – 在OnRowUpdating事件中,GridView的NewValues和O
- asp.net – 如何在网站项目中使用发布配置文件(.pubxml)时设
- asp.net – 兼容性问题是IE10
- 在ASP.Net中使用参数
- IIS是否记录请求标头信息?如果是的话,在哪里?
- asp.net – 哪个NuGet包包含System.Web.Routing?
- asp.net – 如何绑定gridview中的下拉列表?
- 在ASP.NET MVC 3视图中,从JavaScript(jQuery)显示
- asp.net – MVC [HandleError] HandleErrorAttri
- 我如何开始用asp.net学习jquery?
- asp.net <%$...%>语法
- asp.net-identity – IIdentity.Name与IIdentity
- 单元测试ASP.NET WebAPI控制器的POST操作
- asp.net – 如何在不重新启动应用程序的情况下清
- 无法安装ASP.NET MVC 3 RC
- asp.net-mvc – Context.User.Identity.Name为nu
- asp.net mvc – 如何实现面包屑助手在asp.net mv