返回

C# 中的可空类型变量取非空值指南

后端

使用 C# 中的各种方法获取非空值

可空类型

在 C# 中,可空类型变量允许为 null 值的数据类型。为了确保数据安全,在使用可空类型变量时,需要在适当的时候将其转换为非空值。本文将介绍一些常用的方法来获取非空值。

获取非空值的方法

1. 空包容运算符 (!)

空包容运算符是最简单、最直接的方法来获取非空值。它将一个可空类型变量转换为非空类型,如果该变量为 null,则抛出 NullReferenceException 异常。

int? nullableNumber = null;
int nonNullableNumber = nullableNumber!; // 抛出 NullReferenceException 异常

为了避免异常,你可以在使用空包容运算符之前先检查变量是否为 null。

if (nullableNumber != null)
{
    int nonNullableNumber = nullableNumber!;
}

2. 三元条件运算符 (?:)

三元条件运算符也是一种常用的方法来获取非空值。它根据条件表达式来选择两个值中的一个。如果条件表达式为 true,则选择第一个值;否则,选择第二个值。

int? nullableNumber = null;
int nonNullableNumber = nullableNumber ?? 0; // 如果 nullableNumber 为 null,则返回 0,否则返回 nullableNumber 的值

3. Coalesce 方法

Coalesce 方法是 C# 中一个内置方法,它可以用于获取非空值。它接受两个参数,第一个参数是可空类型变量,第二个参数是默认值。如果可空类型变量为 null,则返回默认值;否则,返回可空类型变量的值。

int? nullableNumber = null;
int nonNullableNumber = nullableNumber.GetValueOrDefault(0); // 如果 nullableNumber 为 null,则返回 0,否则返回 nullableNumber 的值

4. IsPattern 表达式

IsPattern 表达式是 C# 9.0 中引入的新特性,它可以用于检查一个变量是否匹配某个模式。如果变量匹配模式,则返回 true;否则,返回 false。

int? nullableNumber = null;
if (nullableNumber is not null)
{
    int nonNullableNumber = nullableNumber; // 确保 nullableNumber 不为 null
}

5. 自定义方法

你还可以编写自己的自定义方法来获取非空值。例如,你可以编写一个方法来检查一个可空类型变量是否为 null,如果为 null,则抛出异常。

public static void CheckNotNull<T>(T? value) where T : struct
{
    if (value == null)
    {
        throw new ArgumentNullException(nameof(value));
    }
}

然后,你可以使用这个方法来检查可空类型变量是否为 null。

int? nullableNumber = null;
checkNotNull(nullableNumber); // 如果 nullableNumber 为 null,则抛出 ArgumentNullException 异常

6. 结论

在 C# 中,有多种方法可以获取非空值。你应该根据具体情况选择最合适的方法。在使用可空类型变量时,务必谨慎,避免出现 NullReferenceException 异常。

常见问题解答

  1. 何时应该使用可空类型?

    当变量可能为 null 时,应该使用可空类型。这有助于避免 NullReferenceException 异常并提高代码的安全性。

  2. 空包容运算符和三元条件运算符有什么区别?

    空包容运算符将可空类型变量转换为非空类型,如果该变量为 null,则抛出异常。三元条件运算符根据条件表达式来选择两个值中的一个,如果条件表达式为 true,则选择第一个值;否则,选择第二个值。

  3. Coalesce 方法和三元条件运算符有什么区别?

    Coalesce 方法将可空类型变量转换为非空类型,如果该变量为 null,则返回默认值。三元条件运算符根据条件表达式来选择两个值中的一个,如果条件表达式为 true,则选择第一个值;否则,选择第二个值。

  4. IsPattern 表达式和三元条件运算符有什么区别?

    IsPattern 表达式检查一个变量是否匹配某个模式,如果变量匹配模式,则返回 true;否则,返回 false。三元条件运算符根据条件表达式来选择两个值中的一个,如果条件表达式为 true,则选择第一个值;否则,选择第二个值。

  5. 在什么情况下应该使用自定义方法来获取非空值?

    当需要进行更复杂的检查或操作时,应该使用自定义方法来获取非空值。例如,你可以编写一个方法来检查可空类型变量是否为 null 并执行额外的操作,例如记录日志或抛出特定的异常。