C#中?、?.、??、??=运算符的用法

下面是详细讲解C#??.????=运算符的用法:

?运算符

?运算符在C#中表示空值传播(Null Propagation),其作用是防止空引用异常(NullReferenceException)的发生,它的基本语法形式如下:obj?.PropertyName

obj不为null时,?.会直接返回obj.PropertyName的值;当objnull时,?.会返回null,不会抛出空引用异常。

下面是一个示例代码:

class Person {
    public string Name { get; set; }
    public House House { get; set; }
}

class House {
    public string Address { get; set; }
}

Person person = null;
string address = person?.House?.Address; // address = null

在上面的示例中,personnull,如果我们直接访问person.House.Address,则会抛出空引用异常,但是我们使用了person?.House?.Address,这样即使personnull,代码也不会抛出异常,而是直接返回了null

?. 运算符

?.运算符是?运算符的简写形式,它在调用可空对象的方法、属性和索引器时非常有用,它的基本语法形式如下:obj?.MethodName()obj?.PropertyNamearray?[index]

obj不为null时,?.会直接调用obj的方法、属性或索引器,并返回其结果;当objnull时,?.会返回null,不会抛出空引用异常。

下面是一个示例代码:

string str = null;
int length = str?.Length ?? 0; // length = 0

在上面的示例中,strnull,如果我们直接调用str.Length,则会抛出空引用异常,但是我们使用了str?.Length,这样即使strnull,代码也不会抛出异常,而是直接返回了null,另外我们使用??运算符为null设置了一个默认值。

??运算符

??运算符在C#中表示空合并运算符(Null Coalescing Operator),用于为一个null值提供一个默认值,它的基本语法形式如下:obj1 ?? obj2

obj1不为null时,??直接返回obj1的值;当obj1null时,??返回obj2的值。

下面是一个示例代码:

int? num1 = null;
int num2 = num1 ?? 0; // num2 = 0

在上面的示例中,num1null,我们使用了num1 ?? 0,这样即使num1null,代码也不会抛出异常,而是直接返回了0

??=运算符

??=运算符在C#8.0中引入,它可以将一个值赋给一个可空类型的变量,当变量的值为null时,才会进行赋值操作,它的基本语法形式如下:obj1 ??= obj2

obj1不为null时,??=不做任何操作;当obj1null时,??=会将obj2的值赋给obj1

下面是一个示例代码:

int? num1 = null;
num1 ??= 10; // num1 = 10

在上面的示例中,num1null,我们使用了num1 ??= 10,这样num1的值就被赋为10

总结一下,??.????=运算符分别表示空值传播、空值传播简写、空合并和空合并赋值,它们可以帮我们简化代码,避免空引用异常的发生。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#中?、?.、??、??=运算符的用法 - Python技术站

(0)
上一篇 2023年5月14日
下一篇 2023年5月14日

相关文章

  • 详解c# 数组(Array)

    详解C#数组(Array) 概述 C#数组是一组相同类型元素的有序集合,可以通过数组下标来访问每一个元素。在C#中,数组是一种按照顺序存储和访问一组元素的结构,数组的下标从0开始,最大下标为数组长度减1。数组是C#中最常用的数据结构之一,能够有效地存储和处理大量数据。 创建和初始化数组 创建数组的语法如下: type[] arrayName; 其中,type…

    C# 2023年5月31日
    00
  • C#简单读取主机上所有进程的方法

    C#简单读取主机上所有进程的方法 在C#中,我们可以使用System.Diagnostics.Process类来读取主机上所有的进程。Process类提供了获取所有正在运行的进程,以及根据名称、PID等条件筛选进程的方法。 下面详细介绍如何使用Process类来读取主机上所有进程。 1. 获取所有正在运行的进程 可以使用Process类的静态方法Proces…

    C# 2023年6月7日
    00
  • C#三种方法获取文件的Content-Type(MIME Type)

    首先,我们需要理解什么是 Content-Type(MIME Type)。Content-Type(MIME Type) 是 HTTP 协议头中一部分,用于描述资源的类型。常见的 MIME类型包括:text/html、application/json、image/png 等等。 在 C# 中获取文件的 Content-Type(MIME Type) 有三种方…

    C# 2023年5月31日
    00
  • C#实现网络小程序的步骤详解

    下面是详细讲解“C#实现网络小程序的步骤详解”的完整攻略。 1. 确定需求和功能 在开始任何项目之前,我们必须明确需求和目标。首先,确定你的网络小程序需要完成的功能,包括功能模块、界面设计等,以此为基础,设计项目结构和流程。 2. 确定开发环境 C#可以在Windows平台上运行,因此您需要安装Visual Studio等适用的软件开发工具。您需要安装.NE…

    C# 2023年6月1日
    00
  • C#仿密保卡功能的简单实现代码

    下面是关于“C#仿密保卡功能的简单实现代码”的完整攻略: 1. 什么是仿密保卡功能? 仿密保卡,顾名思义,是指通过某些方法实现和模拟传统的硬件密保卡的功能。传统的硬件密保卡大多采用一些特定的加密算法和密码体系,将用户的身份信息和敏感数据存储在卡片内部,在用户身份验证和数据交换等场景中发挥重要作用。 仿密保卡则是通过软件的方式实现这些功能,不需要依赖于硬件卡片…

    C# 2023年6月6日
    00
  • C#写日志类实例

    下面是C#写日志类实例的攻略。 概述 在开发应用程序时,经常需要记录应用程序的运行日志,以便在程序出现异常等问题时快速定位问题。C#提供了System.Diagnostics命名空间下的Trace和Debug类用于记录日志信息,而自己编写一个日志类可以更加灵活地记录日志信息,并可以根据自己的需求进行扩展和定制。 实现步骤 1. 创建日志类 首先需要创建一个日…

    C# 2023年6月1日
    00
  • C#实现窗口之间的传值

    C#实现窗口之间的传值是一个重要的技能,特别是在Windows桌面应用程序中常常使用。在本文中,我们将讲解如何实现窗口之间的传值,包括基本概念、技术架构和代码示例等。 一、基本概念 实现窗口之间的传值,我们需要先了解以下几个概念。 窗口之间的传值一般是指在Windows桌面应用程序中,从一个窗口传递数据到另一个窗口或控件的过程。 传值可以是简单的值类型,如i…

    C# 2023年6月1日
    00
  • .net core 中 WebApiClientCore的使用示例代码

    以下是关于“.NET Core中WebApiClientCore的使用示例代码”的完整攻略: 1. 什么是WebApiClientCore? WebApiClientCore是一个.NET的HTTP客户端库,它提供了一种简单的方式来调用Web API。WebApiClientCore支同步和异步调用,并提了一些有用的功能,例如自动序列化和反序列化JSON数据…

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