技术
空引用忽略操作符
田敏
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
作用:
-
消除编译警告: 如果
obj是一个可空类型(如string?),但程序员知道它不可能为null,使用obj!可以避免编译器发出警告。 -
运行时行为:
!仅影响编译时检查,不会改变运行时行为。如果表达式实际为null,在运行时仍然会抛出NullReferenceException。
应用到你的代码
((IFormExceptionFilter)currFilter!).OnFormException(_form, _exceptionContext!);
解释:
-
currFilter!:currFilter可能是一个可空引用类型(例如object?)。- 使用
!告诉编译器:currFilter在此处不会为null。 - 如果实际为
null,运行时会抛出NullReferenceException。
-
_exceptionContext!:_exceptionContext可能是一个可空引用类型(如ExceptionContext?)。!表明:程序员确信_exceptionContext不会为null。
使用 ! 的注意事项
-
确保逻辑正确性: 使用
!的前提是程序员清楚该变量不可能为null,否则可能在运行时导致NullReferenceException。 -
优先避免使用
!: 尽量通过正确的逻辑、非空检查(if或?.)来避免使用!。
替代方案:
如果存在风险,可以先进行空检查:
if (currFilter is IFormExceptionFilter filter && _exceptionContext != null)
{
filter.OnFormException(_form, _exceptionContext);
}
else
{
throw new InvalidOperationException("currFilter or _exceptionContext is null");
}
总结
! 是一种强制声明非空的工具,可以消除编译器警告,但需谨慎使用,确保变量实际不会为 null。对于复杂逻辑场景,更推荐使用显式的空检查以保证代码的健壮性。
版权协议:MIT返回列表