写点什么

在.NET 框架中使用 C# 8 和可空引用类型

  • 2019-11-16
  • 本文字数:1852 字

    阅读完需:约 6 分钟

在.NET框架中使用C# 8和可空引用类型

本文要点:

  • 改变 C#版本需要直接修改项目文件

  • 全局启用可空引用类型只能在新的项目格式中实现

  • 可根据需要,在文件或行的基础上更改可空性

  • 使用可空属性以避免不必要的空检查。

  • 针对较旧的平台时,可使用 Nullable 包


尽管在.NET 框架中,C# 8 的一部分将永远不会得到支持,但是,如果我们知道一些技巧的话,那么可以启用可空引用类型

启用 C# 8

第一步是确保我们使用的是 Visual Studio 2019 16.3 版或更高版本。


然后,我们需要为 C# 8 配置我们的项目。如果我们习惯使用 Visual Studio 的话,那么,我们可能期望能够简单地更改项目设置。不幸的是,那种方式已经无效了。



在新规则下,C#的默认版本由我们要面向的框架决定。只有.NET Core 3.0 和.NET Standard 2.1 可以用 C# 8 ,其他的都从 C# 7.3 版本开始。


我们可以通过编辑项目文件来覆盖它。打开项目的.csproj 文件,并在 PropertyGroup 中添加下面这行代码:


<LangVersion>8.0</LangVersion>
复制代码


如果我们使用现代项目格式的话,那么,在解决方案资源管理器(Solution Explorer)中双击该项目就可以将其打开。我们可以识别出这个格式,因为 XML 文件看起来是这样的:


<Project Sdk="Microsoft.NET.Sdk">
复制代码


如果我们使用遗留项目格式的话,那么,直接编辑它有点复杂。可以选择关闭 Visual Studio,使用 Notepad 或其他文本编辑器。或者,我们可以安装Visual Studio的Power Commands,它会添加一个“Edit Project File”命令。作为参考,XML 文件的根看起来类似这个:


<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
复制代码

启用可空引用类型:

接下来是启用可空引用类型功能。如果我们使用现代项目格式的话,那么,我们可以通过在语言版本的后面添加如下所示的代码行来全局化实现这一点:


<Nullable>enable</Nullable>
复制代码


如果我们使用遗留项目格式的话,那么,这样做就不起作用。我们不会得到错误提示,编译器只是忽略这个设置。因此,我们必须逐个文件地启用它。要做到这一点,必须在每个文件的顶部添加可空指令:


#nullable enable
复制代码


如果我们希望逐步启用该功能,那么,在现代项目中也可以这么做。

可空性属性

有各种各样的属性可用于微调空检查器的行为。为了解释该功能,可以考虑如下函数:


bool TryGet(int key, out Customer? customer)
复制代码


隐含的约定是,如果该函数返回 true,那么,customer 参数将不为空。反之,如果该函数返回 false,那么,customer 参数将为空。


但是,这不是签名的一部分,因此,如果我们要这样使用这个函数,那么,我们就总是需要在 customer 上进行一个无关的空检查。解决方法是,添加一个阐明行为的属性:


bool TryGet(int key, [NotNullWhen(true)] out Customer? customer)
复制代码


从编译器的角度来看,这意味着,如果返回 true,那么,customer 将永远不会是空值。如果返回的是 false,它没有说明会发生什么情况,但是,这仍然足以解决签名问题了。


在《尝试可空引用类型》这篇文章中,Phillip Carter 详细地描述了各种属性:


  • 条件化的后置条件:MaybeNotNullWhen(bool)、 NotNullWhen(bool)

  • 依赖是非为空:NotNullIfNotNull

  • 流:DoesNotReturn、DoesNotReturnIf(bool)

  • 后置条件:MaybeNull、NotNull

  • 前置条件:AllowNull、DisallowNull

旧项目中的可空性属性

为了实际使用这些属性,需要定义它们。如果我们在使用.NET Standard 2.1 或.NET Core 3.0 的话,那么,这些已经是现成的了。否则,我们将不得不创建它们,把它们作为我们项目的一部分。


处理这个问题的传统方式是创建一个新的.NET Core 3 项目,使用 F12 对所需的属性进行反向工程。然后,我们可以把它粘贴到我们的项目上,并添加缺少的细节,对于属性来说,这只需要几分钟时间。


一种更简单的方法是,简单地安装 Maunel Römer 的Nullable包。这将把 NullableAttributes.cs 文件复制到我们的项目中,其中包括所有必需的属性。这个包没有编译过的组件,只是一个源代码文件。


这两种方法都要确保所有的属性被标记成“内部”,而不是公共。这是为了避免与也可能向后移植属性的其他库发生冲突。


作者介绍


Johathan Allen 于 90 年代后期开始为一家医疗诊所开发 MIS 项目,逐步地将它们从 Access 和 Excel 提升到企业解决方案。在为金融行业编写了 5 年自动交易系统后,他成了多个项目的顾问,这些项目包括机器人仓库的 UI、癌症研究软件的中间层以及一家大型房地产保险公司的大数据需求。在业余时间,他热衷于对 16 世纪的武术进行研究及相关的写作。


原文链接:


Using C# 8 and Nullable Reference Types in .NET Framework


2019-11-16 08:007077

评论

发布
暂无评论
发现更多内容

PyTorch: 权值初始化

timerring

PyTorch

申请 GPT4.0Key!含详细步骤

石云升

AIGC ChatGPT GPT-4

少年侠客【InsCode Stable Diffusion美图活动一期】 | 社区征文

度假的小鱼

Stable Diffusion 年中技术盘点

Visual Studio Code错误:Cannot build and debug because the active file is not a C or C++ source file

codists

Visual Studio Code

3D渲染速度慢,花重金买显卡还是用云渲染更划算

3DCAT实时渲染

实时渲染云

CnosDB x LangChain: 聊着天来查询时序数据库

CnosDB

开源 时序数据库 CnosDB

一个普通程序员如何看待chatgpt大火 | 社区征文

不觉心动

年中技术盘点

C语言宏定义中的#和##

智趣匠

Nautilus Chain NautDID NFT 将上主网,Layer3 数字身份时代开启

EOSdreamer111

IoTOS-v1.5.3 新增 智能诊断&会话记录导出

IoTOS

物联网平台 IoT 开源物联网 国产开源 开源项目介绍

Antlr4如何自动解析得到AST而不是ParseTree

canonical

ANTLR 低代码 dsl antlr4

代码随想录Day18 - 二叉树(五)

jjn0703

阿里云服务器安装宝塔面板教程。

百度搜索:蓝易云

云计算 Linux 运维 云服务器 ECS

WAIC2023丨AI图像内容安全“黑科技”如何助力科技向善发展?

陈橘又青

Nautilus Chain NautDID NFT 即将上线主网,Layer3 数字身份时代开启

大瞿科技

学校招生报名小程序开发笔记(一)

CC同学

从0到1:跑团小程序开发心得笔记

CC同学

2023-07-16:讲一讲Kafka与RocketMQ中零拷贝技术的运用?

福大大架构师每日一题

福大大架构师每日一题

Nautilus Chain NautDID NFT 将上主网,Layer3 数字身份时代开启

股市老人

Cnetos7编译安装Pure-Ftpd教程。

百度搜索:蓝易云

云计算 Linux centos 运维 Pure-FTPd

chatgpt和文心一言哪个更厉害 | 社区征文

张三丰无极

年中技术盘点

小设计,大作用——谈谈防腐层的妙用

JAVA旭阳

Java

Ins风韩国美少女【InsCode Stable Diffusion美图活动一期】

繁依Fanyi

明代元素时装小姐姐【InsCode Stable Diffusion美图活动一期】

繁依Fanyi

人工智能大语言模型微调技术:SFT 监督微调、LoRA 微调方法、P-tuning v2 微调方法、Freeze 监督微调方法| 社区征文

汀丶人工智能

LoRa NLP 大模型 LLM模型 年中技术盘点 Freeze微调

人工智能自然语言处理:N-gram和TF-IDF模型详解

汀丶人工智能

人工智能 自然语言处理 nlp tf-idf N-gram

Cnetos7编译安装Tomcat教程。

百度搜索:蓝易云

云计算 tomcat Linux centos 运维

Open AI爆火,4个中国版ChatGPT扎堆爆发 | 社区征文

我搬去水星了

年中技术盘点

我与OpenHarmony| 社区征文

坚果

年中技术盘点

可爱小猫猫【InsCode Stable Diffusion美图活动一期】

繁依Fanyi

领导和团队的自主权——《敏捷实战-破解敏捷落地的60个难题》读后感(二)

Bruce Talk

敏捷开发 Agile

在.NET框架中使用C# 8和可空引用类型_编程语言_Jonathan Allen_InfoQ精选文章