C#中感叹号「!」 的作用总结

1. 感叹号「!」在C#中的作用概述

在C#中,感叹号「!」是一个重要的符号,它具有多种作用。在本文中,我们将详细介绍感叹号在C#中的不同用法。

2. 声明非空引用类型

在C#中,感叹号用于声明非空引用类型。非空引用类型是指不能为null的引用类型。通过在变量声明后面添加感叹号,我们可以告诉编译器该变量不会为null。

2.1 示例

string str!;

int[] numbers!;

在上面的示例中,我们声明了一个非空的字符串变量str和一个非空的整数数组numbers。因为它们被声明为非空引用类型,所以它们不能为null。

3. 空引用断言

另一个感叹号的常见用途是进行空引用断言。当我们确定一个对象不会为null时,可以使用感叹号来告诉编译器我们已经做了必要的检查,该对象不会为空。

3.1 示例

string? nullableString = null;

string nonNullString = nullableString!;

在上面的示例中,我们声明了一个可空字符串变量nullableString,并将其赋值为null。然后,我们使用感叹号告诉编译器我们已经确定nullableString不会为null,并将其赋值给非空字符串变量nonNullString。

注意:如果在进行空引用断言时,引用为null,会抛出NullReferenceException异常。

4. 显示转换为布尔类型

C#中的感叹号还可以用于将其他类型的值转换为布尔类型。当我们将一个值转换为布尔类型时,感叹号将对该值进行逻辑非运算,并返回相应的布尔结果。

4.1 示例

int number = 10;

bool isZero = !number;

在上面的示例中,我们有一个整数变量number,其值为10。然后,我们使用感叹号将该值转换为布尔类型,并将结果赋值给isZero。因为10的逻辑非是false,所以isZero的值将为false。

5. 在泛型约束中使用

感叹号在C#中还可用于泛型约束。当我们定义一个泛型类型或方法时,可以使用感叹号来限制泛型参数必须为引用类型。

5.1 示例

public class MyClass<T> where T : class

{

// class-specific implementation here

}

在上面的示例中,我们定义了一个名为MyClass的泛型类。通过在泛型约束中使用感叹号,我们限制泛型参数T必须是引用类型。

6. 异步操作标记

C# 7.1及以上版本中的感叹号还可以用于标记异步方法和lambda表达式中的操作符。这样做可以提高代码可读性,使开发人员更容易理解代码的含义。

6.1 示例

public async Task<bool> DoSomethingAsync()

{

await Task.Delay(1000).ConfigureAwait(false);

return true!;

}

在上面的示例中,我们定义了一个异步方法DoSomethingAsync。在返回值的类型后面我们使用感叹号来标记该方法将始终返回true(例如,不会返回null)。

注意:在此用法中,感叹号并不改变实际的逻辑行为,只是为了在代码中清晰地表达某些操作符的意图。

7. 结论

在本文中,我们总结了C#中感叹号「!」的多种用途。从声明非空引用类型到空引用断言,再到转换为布尔类型和泛型约束,感叹号在C#中具有广泛的应用。同时,我们还介绍了新的使用感叹号标记异步操作的方式。通过了解这些用法,我们可以更好地理解和应用C#中的感叹号。

后端开发标签