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日

相关文章

  • C#实现异步的常用方式总结

    让我来详细讲解一下“C#实现异步的常用方式总结”的完整攻略。 异步编程简介 在 C# 中,我们使用异步编程来执行长时间运行的操作,以便不会阻塞主线程。异步编程可以在不使用多线程的情况下实现并发性,并且能够改善应用程序的响应性能。 C# 实现异步的常用方式 C# 实现异步的常用方式主要有以下方式: 1.使用 Task 和 async/await Task 和 …

    C# 2023年5月15日
    00
  • .Net Core读取文件时中文乱码问题的解决方法分享

    .NET Core读取文件时中文乱码问题的解决方法分享 在使用.NET Core读取含有中文字符的文件时,有时会出现中文字符乱码的问题。这是因为在不同的编码方式下,中文字符会以不同的方式表示。本文将详细介绍读取文件时中文乱码问题的解决方法,并提供两个示例。 问题分析 先来看一个示例: string contents = System.IO.File.Read…

    C# 2023年6月3日
    00
  • WCF分布式开发之MSMQ消息队列

    WCF分布式开发之MSMQ消息队列 WCF(Windows Communication Foundation)是一种用于构建分布式应用程序的框架。它提供了一种统一的编程模型,使得开发人员可以使用不同的传输协议和编码方式来实现分布式应用程序。其中,MSMQ(Microsoft Message Queuing)消息队列是WCF中常用的一种传输协议,它可以实现异步…

    C# 2023年5月15日
    00
  • C#使用Process类调用外部程序分解

    使用Process类调用外部程序分解 在C#中,我们可以使用Process类来调用并控制外部程序的运行。常见的用途之一是运行一些命令行程序或工具,以获取额外的功能。 使用Process类调用外部程序 使用Process类的关键步骤如下: 引入命名空间 using System.Diagnostics; 创建Process对象 Process process …

    C# 2023年6月7日
    00
  • 分享两种实现Winform程序的多语言支持的多种解决方案

    接下来我将详细讲解Winform程序实现多语言支持的多种解决方案。 1. 利用Resx文件实现多语言支持 Resx文件是.NET中专门用于多语言支持的文件格式,可以用来存储不同语言的文本信息,在程序中通过读取Resx文件来实现不同语言的界面显示。 1.1 创建Resx文件 创建Resx文件有多种方式,这里以Visual Studio为例。 在Visual S…

    C# 2023年6月7日
    00
  • C# CopyTo(Array,Int32):从特定的索引开始将集合的元素复制到数组中

    C#中的 CopyTo 方法定义在 System.Array 类中。它允许将当前数组中的元素复制到另一个数组中。 CopyTo 方法有两个参数,第一个参数指定目标数组,第二个参数则指定从目标数组中的哪个位置开始复制。在本文中,我们将详细讲解 CopyTo 方法的完整攻略,并提供两个示例以便更好地理解它的工作原理。 语法 public void CopyTo(…

    C# 2023年4月19日
    00
  • C#如何Task执行任务,等待任务完成

    当我们需要在应用程序中执行耗时的任务时,我们可以使用Task类。下面是使用Task执行任务并等待任务完成的攻略: 创建Task任务 要创建一个Task,我们可以使用Task.Run()方法来启动一个任务。该方法接受一个委托(Delegate)类型的参数,该委托指定要在新线程上运行的代码。 例如,下面是一个简单的Task创建示例: Task task = Ta…

    C# 2023年6月6日
    00
  • .NET中的MassTransit分布式应用框架详解

    以下是“.NET中的MassTransit分布式应用框架详解”的完整攻略: 什么是MassTransit MassTransit是一个开源的分布式应用框架,用于构建可扩展的、高可用的、松耦合的分布式应用程序。它基于消息传递模式,支持多种消息传递协议,例如RabbitMQ、Azure Service Bus、Amazon SQS等。 MassTrans的核心概…

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