田敏
返回博客列表
技术

空引用忽略操作符

田敏
2024-11-171 分钟阅读
.NETC#Backend

在 C# 中,!空引用忽略操作符(null-forgiving operator)。它告诉编译器忽略该表达式可能为空(null)的警告。


详细说明

! 用于告诉编译器:

"我明确知道这个对象不可能是 null,即使分析看起来会有 null 的风险。"

这是 C# 8.0 引入的特性,目的是配合 可空引用类型(nullable reference types)。在启用可空引用类型的项目中,编译器会对可能为空的对象发出警告,而 ! 可以用来消除这些警告。


语法和语义

object obj = GetObject();  // obj 可能为 null
string result = obj!.ToString();  // 使用 `!` 告诉编译器,obj 不会为 null

作用

  1. 消除编译警告: 如果 obj 是一个可空类型(如 string?),但程序员知道它不可能为 null,使用 obj! 可以避免编译器发出警告。

  2. 运行时行为! 仅影响编译时检查,不会改变运行时行为。如果表达式实际为 null,在运行时仍然会抛出 NullReferenceException


应用到你的代码

((IFormExceptionFilter)currFilter!).OnFormException(_form, _exceptionContext!);

解释:

  1. currFilter!

    • currFilter 可能是一个可空引用类型(例如 object?)。
    • 使用 ! 告诉编译器:currFilter 在此处不会为 null
    • 如果实际为 null,运行时会抛出 NullReferenceException
  2. _exceptionContext!

    • _exceptionContext 可能是一个可空引用类型(如 ExceptionContext?)。
    • ! 表明:程序员确信 _exceptionContext 不会为 null

使用 ! 的注意事项

  1. 确保逻辑正确性: 使用 ! 的前提是程序员清楚该变量不可能为 null,否则可能在运行时导致 NullReferenceException

  2. 优先避免使用 !: 尽量通过正确的逻辑、非空检查(if?.)来避免使用 !

替代方案:

如果存在风险,可以先进行空检查:

if (currFilter is IFormExceptionFilter filter && _exceptionContext != null)
{
    filter.OnFormException(_form, _exceptionContext);
}
else
{
    throw new InvalidOperationException("currFilter or _exceptionContext is null");
}

总结

! 是一种强制声明非空的工具,可以消除编译器警告,但需谨慎使用,确保变量实际不会为 null。对于复杂逻辑场景,更推荐使用显式的空检查以保证代码的健壮性。

版权协议:MIT返回列表