在C#语言里对NULL的技术处理

文章目录

  • 前言
  • [1 、NULL合并操作符(??)](#1 、NULL合并操作符(??))
  • [2. 条件运算符 (?:)](#2. 条件运算符 (?:))
  • [3. 空条件运算符(?.)](#3. 空条件运算符(?.))
  • [4. 空合并赋值操作符 (??=)](#4. 空合并赋值操作符 (??=))
  • [5. 宽容运算符 (!.)](#5. 宽容运算符 (!.))
  • [6. 使用 is 运算符](#6. 使用 is 运算符)
  • [7. ArgumentNullException 参数空异常](#7. ArgumentNullException 参数空异常)
  • 结论

前言

在 C# 中,null 是一个特殊存在,表示缺少值。Null 可以分配给引用类型和可为 null 的值类型,但不能分配给不可为空的值类型。在 C# 中处理 null 值是编写可靠且可靠的代码的一个重要方面。在本文中,我将讨论一些在 C# 中处理 null 值的最常用技术。


1 、NULL合并操作符(??)

null合并操作符(??)是一个简写操作符,用于在左侧对象不为null时返回左侧值,在左侧对象为null时返回右侧值。当您在判断当前对象值是否null值并且赋值新对象需要简写时,此操作符非常有用。

csharp 复制代码
string name = null;
string result = name ?? "Unknown";
Console.WriteLine(result); // Output: Unknown
在上面的示例中,由于name的值为null,因此使用null合并运算符将"Unknown"的值赋给result。

2. 条件运算符 (?😃

条件运算符(?:)是一个三元运算符,用于代替if-else的简写,如果条件为真则返回一个值,如果条件为假则返回另一个值。当需要根据条件提供默认值时,此操作符很有用。

csharp 复制代码
string name = null;
string result = (name != null) ? name : "Unknown";
Console.WriteLine(result); // Output: Unknown
在上面的例子中,由于name的值为null,因此使用条件运算符将"Unknown"的值赋给result。

3. 空条件运算符(?.)

如果对象不为空,则使用空条件操作符(?.)访问对象的成员,否则返回空。当您需要访问可能为空的对象的属性或方法时,此操作符非常有用。

csharp 复制代码
string name = null;
int? length = name?.Length;
Console.WriteLine(length); // Output: null

在上面的例子中,因为name的值是空的,所以length的值也是空的。

但你也可以利用 合并操作运算符(??) 进行进阶的写法,代码如下:

csharp 复制代码
string name = null;
int length = name?.Length??0;
Console.WriteLine(length); // Output: 0

可以看到上面的代码例子里,length可以不用空的值类型获取name的长度,可以在你的业务逻辑里认为null的字符串长度也可以是0长度,减少后期值类型的复杂判断。

4. 空合并赋值操作符 (??=)

空合并赋值操作符(??=)用于在左侧对象为空时将右侧对象赋值给左侧。意思就是如果变量对象为空,可以给它赋值一个默认对象值,在理解上它可以简化代码并使其更加简洁。

csharp 复制代码
string name = null;
name ??= "Unknown";
Console.WriteLine(name); // Output: Unknown

在上面的示例中,由于name的值为空,因此使用空合并赋值操作符将"Unknown"的值赋给name。

5. 宽容运算符 (!.)

允许为空的操作符(!.)用于告诉编译器值不为空,即使编译器无法确定该值不为空。当您知道一个值不会为空,但编译器无法确定它不会为空时,此操作符很有用。

csharp 复制代码
string name = null!;
int length = name.Length;
Console.WriteLine(length); // Output: System.NullReferenceException

在上面的例子中,宽容操作符用于告诉编译器name的值不可为空。但是,由于name的值实际上是空的,所以系统在运行时抛出NullReferenceException。

6. 使用 is 运算符

在C#编程语言中,"is"操作符是一个关键字,用于检查变量是否与特定类型兼容。随着C#7.0中常量模式的引入,这个运算符获得了额外的功能。具体来说,现在可以使用"is"操作符将值与常量(如null)进行比较。

csharp 复制代码
if (name is null)
{
   // code to execute
}
Console.WriteLine(name);

使用"is"运算符的扩展功能使开发人员能够在c#应用程序中执行类型检查和比较时编写更简洁、更可读的代码。

或者,您也可以使用操作符检查:==null

csharp 复制代码
object obj = null;
 
if (obj == null)
{
    // do something if obj is null
}
else
{
    // do something else if obj is not null
}

这两种方法都可以,但是使用操作符进行检查可能更具可读性和表现力,特别是当与其他类型检查 is null 结合使用时。

7. ArgumentNullException 参数空异常

最后,ArgumentNullException类用于处理传递给方法或构造函数的空参数。当您需要确保传递给方法或构造函数的参数不为空时,该类非常有用。

csharp 复制代码
public void DoSomething(string name)
{
    if (name == null)
    {
        throw new ArgumentNullException(nameof(name));
    }
    
    Console.WriteLine($"Hello, {name}!");
}
 
// Usage
DoSomething(null); // Output: System.ArgumentNullException: Value cannot be null. (Parameter 'name')

在上面的例子中,ArgumentNullException类用于在name的值为空时抛出异常。

结论

在软件开发中,处理null值是非常重要的事情。我们讨论了在C#中处理null值的7种技术。此外,在C#中处理null值对于避免空引用异常和其他意外行为也很重要。

相关推荐
IndulgeCui3 分钟前
KingbaseES 数据库与用户默认表空间深度解析与实战分享
数据库
萧曵 丶8 分钟前
MongoDB 核心原理 + 高频面试题
数据库·mongodb
darling33115 分钟前
mysql 自动备份以及远程传输脚本,异地备份
android·数据库·mysql·adb
Bruk.Liu15 分钟前
(LangChain实战12):LangChain中的新型Chain之create_sql_query_chain
数据库·人工智能·sql·langchain
世界尽头与你17 分钟前
MySQL InnoDB的 MVCC 实现机制
数据库·mysql
计算机学姐22 分钟前
基于SpringBoot的校园社团管理系统
java·vue.js·spring boot·后端·spring·信息可视化·推荐算法
你刷碗32 分钟前
基于S32K144 CESc生成随机数
android·java·数据库
松涛和鸣33 分钟前
70、IMX6ULL LED驱动实战
linux·数据库·驱动开发·postgresql·sqlserver
hssfscv34 分钟前
Javaweb学习笔记——后端实战8 springboot原理
笔记·后端·学习
咚为35 分钟前
Rust tokio:Task ≠ Thread:Tokio 调度模型中的“假并发”与真实代价
开发语言·后端·rust