微软在C# 8中引入预览版可空引用类型

news/2024/7/3 0:45:10

微软已经为开发者提供了预览版的可空引用类型(Nullable Reference Type),想尝鲜的开发者可以尝试这个新特性,并提供反馈。

\\

预览版可空引用类型是Visual Studio 2017 15.5 Preview 4+的Roslyn扩展,现在支持.NET框架,很快也将支持.NET Core。该特性在C# 8中是默认启用的。微软为此提供了安装指南。

\\

在C# 8中引入新的可空引用类型是为了解决十亿美元问题(Billion Dollar Mistake)。1965年,英国计算机科学家Tony Hoare在开发ALGOL时称其为空引用(Null Reference)。指针最主要的问题是,有时候它们会为空,而这并非我们所期望的。在将空指针作为一种特性引入之后,反而变成产生bug的主要源头。

\\

早在2011年,用户就在Visual Studio User Voice里要求“在C#中引入不可空引用类型”,一年之后,经过投票,该需求排到了第15位,现在已经跑到了第一的位置上。这个特性之所以在很长一段时间内都无法实现,是因为C#的空引用到处可见。C#首席设计师Mads Torgersen解释说:

\\
\

问题是空引用太有用了。在C#里,引用类型默认就是空值。还能用其他什么值来作为默认值吗?在你知道该给一个变量赋什么值之前,拿什么作为它的默认值?一个新创建的引用数组又该使用怎样的默认值?

\\

有时候,空值本身也是有意义的。比如,有时候需要让一个字段不包含任何值,或者将空值作为参数进行传递也是没有问题的。但这些情况并不常见。这里还有另一个问题:像C#这样的语言并没有提供一种方式可以用于说明某处的空值是有意义的还是无意义的。

\
\\

为了避免在C#中引入不可空引用类型,微软将引用类型规定为默认不可空,并提供了一些机制用于处理可空类型。他们认为,大部分情况下引用类型都是非空或被间接引用的。Torgersen写道:

\\
\\t
  1. 我们相信,大部分情况下引用类型都不应该为空。可空引用类型是很罕见的(尽管很难说具体多罕见),所以需要单独对它们进行注解。\\t\t
  2. C#已经提供了可空的值类型(value type)。\\t\t
  3. 不应该让你自己或其他人在空值这个问题上有太多负担,除非你确定需要它们。空值应该是我们需要显式去指定的。\\t
\\

可空引用类型通过问号来定义,如下所示:

\\
\class Person {\  public string FirstName; // Not null\  public string? MiddleName; // May be null\  public string LastName; // Not null\}\
\\

微软希望开发者试用这个新特性,并提供反馈。

\\

更多的信息可参考 C# Futures: Nullable Reference Types、C# 8.0 Previewed、A Proposal for Non-Nullable Types in C#。

\\

查看英文原文:Microsoft Previews Nullable Reference Types in C# 8


http://lihuaxi.xjx100.cn/news/238523.html

相关文章

Docker的使用(四:Docker Registry本地私有仓库搭建知识点总结)

任务一: Docker Registry本地私有仓库搭建 1、启动Docker Registry; 2、重命名镜像; 3、推送镜像; 4、浏览器查看验证; 5、文件查看验证; 任务二:Docker Registry本地私有仓库配置;…

适合初学者的数据结构_数据结构101:数组-初学者的直观介绍

适合初学者的数据结构了解您每天使用的数据结构。 (Get to know the data structures that you use every day. ) Welcome! Let’s Start with some Vital Context. Let me ask you this: ✅ Do you listen to music on your smartphone?✅ Do you keep a list of contacts on…

Java排序算法:冒泡排序

Java排序算法&#xff1a;冒泡排序//创建数组并赋值int[] data new int[] {11,10,55,78,100,111,45,56,79,90,345,1000};for(int i0;i < arr.length-1;i){for(int j 0; j < arr.length-i-1;j){if(arr[j] > arr[j1]){int temp arr[j];arr[j] arr[j1];arr[j1] temp;…

Kali Linux攻防系统(一:攻防系统Kali Linux下载安装与更新)

任务一&#xff1a;攻防系统Kali Linux下载安装与更新 1.1、安装Kali Linux虚拟机 1.1.1、电脑硬件配置至少达到 CPU 内存 存储 >四核 >4G >20G 1.1.2、VMware Workstations版本为14及以上&#xff1b; 1.1.3、虚拟机系统版本选择Debian 8.X或者Ubuntu&#x…

面试官问你想找什么工作_找工作时如何面试面试官

面试官问你想找什么工作在技​​术面试中要问的十二个问题 (Twelve questions to ask at tech interviews) I’ve just come off six weeks’ of interviewing for medior software developer roles, in a market that is desperate for talent (Amsterdam). That means I went…

C语言技术讲解

想知道更多关于区块链技术知识&#xff0c;请百度【链客区块链技术问答社区】 链客&#xff0c;有问必答&#xff01;&#xff01;C语言&#xff1a; C语言是介于汇编语言和高级语言之间的语言&#xff0c;属于高级语言&#xff0c;也称为中级语言&#xff0c;是集汇编和高级语…

JDBC操作MySQL Lob字段记实

JDBC操作MySQL Lob字段记实虽然Java的持久化框架多如牛毛&#xff0c;但都离不开JDBC技术&#xff0c;JDBC在某些时候是其他框架难以取代的。也是java操作数据库最根本的技术。上文写了JDBC操作DB2 Lob字段bug问题&#xff0c;为此&#xff0c;我还特意写了MySQL平台下的Lob字段…

Kali Linux攻防系统(三:在Kali Linux系统中配置安全测试浏览器及系统清理备份)

任务三&#xff1a;配置安全测试浏览器及系统清理备份 3.1、汉化Firefox并安装安全插件 3.1.1、汉化Firefox浏览器&#xff0c;安装中文插件&#xff0c;并更改设置&#xff1b; 3.1.2、在浏览器附加组件管理器中查找“Web Developr”插件 3.1.3、安装添加附件组件 3.2、手动…