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#中的感叹号。