C#新特性之可空引用类型

C#新特性之可空引用类型

在 C# 8.0 版本中,引入了一种全新的类型——可空引用类型。这种类型让我们能够更精确的掌控和避免代码中可能存在的 null 引用异常(NullReferenceException)。

可空引用类型的定义

可空引用类型是一种新的变量类型,允许存储 null 值。在使用可空引用类型时,我们必须使用 ? 操作符将类型名称与声明分开。

string? name = null;

在可空引用类型的声明中,变量名后必须加一个问号(?)这一点与普通的引用类型稍有不同。这是因为可空引用类型本身允许存储 null 值。

可空引用类型的使用

当我们使用了可空引用类型后,变量在赋值时需要与 null 做一个判断。

string? name = null;
if(name != null)
{
    Console.WriteLine(name.Length);
}

这里我们加入了一个 if 语句用于判断 name 是否为 null,如果不为 null,则可以调用 name 上面的 Length 属性。否则,程序不会尝试使用 null 值,也没有了 NullReferenceException 异常。

可空引用类型的其他特性

默认情况下是关闭的

C# 8.0 中的可空引用类型默认是关闭的,意味着编译器不会产生任何警告或错误信息。我们可以手动开启可空引用类型检查,即使代码中忘记判定 null 或者没有经过充分初始化,编译器都会提醒我们,并且还会进行一些额外的检查。

需要标注为可空类型

由于可空引用类型是一种新的类型,在代码中我们必须对其进行标注,否则编译器会给出警告。对于不确定是否为 null 的代码块,比如对于函数参数或者返回值,我们应该使用可空引用类型。

可空引用类型的上下文感知

可空引用类型会在上下文感知到自身能够为 null 的可能性,这意味着编译器可以揭示出代码中潜在的缺陷。例如,编译器会检查所有变量是否已经初始化。

示例说明

在代码中,如果我们想要使用可空引用类型,可以使用以下代码:

string? myName;

// 编译器会提醒我们,我们忘记给 myName 赋值了
Console.WriteLine(myName.ToUpper()); 

输出结果:

warning CS8602: Dereference of a possibly null reference.

在这个示例中,我们没有为 myName 赋值。因此,当我们尝试使用它上面的 ToUpper 方法时,编译器会提醒我们可能存在 null 引用。

另外,如果我们将下面的注释去掉,可以启用 C# 的可空引用类型检查功能,即使代码中忘记判定 null 或者没有经过充分初始化,编译器都会提醒我们,并且还会进行一些额外的检查。

#nullable enable

string myName;

if (myName != null)
{
    Console.WriteLine(myName.ToUpper());
}

这里使用了 #nullable enable 命令启用了 C# 的可空引用类型检查功能,可以对代码进行更严格的检查,防止空指针异常的出现。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#新特性之可空引用类型 - Python技术站

(0)
上一篇 2023年6月7日
下一篇 2023年6月7日

相关文章

  • .Net Core WebApi部署到Windows服务器上的步骤

    部署.NET Core WebApi到Windows服务器上的步骤如下: 在Windows服务器上安装.NET Core运行时环境。 在Windows服务器上安装IIS。 在Windows服务器上安装ASP.NET Core Module。 在Windows服务器上创建一个新的网站。 配置网站以使用ASP.NET Core Module。 将WebApi部署…

    C# 2023年5月16日
    00
  • C#中IEnumerable、ICollection、IList、List之间的区别

    C#中的IEnumerable、ICollection、IList、List是常见的集合接口,它们都用于在程序中管理集合数据类型,但在某些情况下,它们之间的区别比较模糊。下面我们来详细讲解它们之间的区别。 IEnumerable IEnumerable 是一个最基本的集合接口,所有的集合类型都可以实现IEnumerable接口。它只提供了一个GetEnume…

    C# 2023年5月15日
    00
  • C#实现流程图设计器

    关于如何实现C#流程图设计器,可以分以下几个步骤: 1. 确定设计思路 首先需要思考如何设计绘制流程图的界面,如何实现元素的拖拽、连接等操作,并考虑如何存储绘制的流程图信息。一种常用的思路是采用WPF技术来实现绘制界面,并使用XML文件来存储流程图信息。 2. 实现界面设计 使用WPF技术实现绘制界面,可以使用Canvas等控件来实现流程图的绘制。需要注意的…

    C# 2023年6月6日
    00
  • C# 输出参数out问题

    当我们在C#中使用方法时,有时需要从方法中返回多个值。但是,C#中的方法只能够返回单个值。为了解决这一问题,我们可以使用输出参数(out parameter)。在这篇攻略中,我会详细讲解“C# 输出参数out问题”的相关内容。 输出参数(out parameter)是什么? 输出参数是C#中一种特殊的参数类型,用于从方法中返回多个值。和普通参数不同,输出参数…

    C# 2023年6月7日
    00
  • C# 数据库链接字符串加密解密工具代码详解

    下面是“C# 数据库链接字符串加密解密工具代码详解”的完整攻略。 1. 什么是数据库链接字符串加密解密? 在 C# 中,我们经常需要连接数据库进行数据交互。而数据库连接字符串包含数据库服务器地址、登录名和密码等敏感信息,需要对其进行加密保护。数据库链接字符串加密解密就是为了保护这些敏感信息不被不良程序窃取。 2. 如何加密和解密数据库链接字符串? C# 提供…

    C# 2023年6月1日
    00
  • C#中的图像Image类与打印Printing类用法

    C#中的图像Image类与打印Printing类用法攻略 概述 在C#中,Image类和Printing类都是常用的操作图像和打印的类,它们提供了丰富的方法和属性,可以方便地实现各种图像的处理和打印。 Image类:Image类是用于操作图像的类,可以将图像加载到内存中、进行绘制、剪切等操作。 Printing类:Printing类是用于打印的类,可以控制打…

    C# 2023年6月8日
    00
  • C#实现加密bat文件的示例详解

    C# 实现加密 bat 文件的示例详解 引言 加密 bat 文件可以保护命令脚本中的敏感信息,防止其被其他人查看或篡改。本文将从以下几个方面详细介绍 C# 实现加密 bat 文件的过程: 加载 bat 文件内容 对 bat 文件内容进行加密 将加密后的 bat 文件内容写入 bat 文件 升级加密算法 加载 bat 文件内容 要将 bat 文件加密,首先需要…

    C# 2023年6月1日
    00
  • .net设计模式之装饰模式(Decorator)

    当我们需要在不改变原有类的情况下对其进行新功能添加或修改时,装饰模式是一种适用的设计模式。它允许向一个现有对象添加新的功能,同时又不改变其结构。该模式是一种结构性模式。 装饰模式(Decorator)的基本结构 装饰模式有四个角色: 抽象构建(Component):定义一个对象接口,可以给这些对象动态地添加职责。 具体构建(ConcreteComponent…

    C# 2023年6月3日
    00
合作推广
合作推广
分享本页
返回顶部