在 C# 中,问号 ? 的一些作用
在 C# 中,问号 ?.
是空条件运算符(null-conditional operator),它提供了安全的成员访问方式。在您提供的代码中:
EventTrigger trigger = ship?.GetComponent<EventTrigger>();
问号 ?.
的作用:
安全访问:
如果
ship
不为null
,则正常执行GetComponent<EventTrigger>()
如果
ship
为null
,则整个表达式返回null
(不会抛出异常)
等价于以下传统写法:
EventTrigger trigger = null; if(ship != null) {trigger = ship.GetComponent<EventTrigger>(); }
为什么需要这个运算符?
避免 NullReferenceException:
// 如果 ship 为 null 会崩溃 EventTrigger trigger = ship.GetComponent<EventTrigger>(); // 使用 ?. 安全 EventTrigger trigger = ship?.GetComponent<EventTrigger>(); // 安全
链式调用安全:
// 安全访问嵌套属性 var length = player?.weapon?.bullet?.length ?? 0;
在 Unity 中的典型应用场景:
// 安全获取组件
Rigidbody rb = target?.GetComponent<Rigidbody>();// 安全调用方法
enemy?.TakeDamage(10);// 安全访问transform
Vector3 pos = player?.transform?.position ?? Vector3.zero;
配合其他运算符使用:
与空合并运算符
??
结合:// 如果 ship 或组件为 null,则使用默认值 EventTrigger trigger = ship?.GetComponent<EventTrigger>() ?? defaultTrigger;
与 null 条件索引器
?[]
配合:// 安全访问数组元素 var firstItem = items?[0];
注意事项:
返回值类型:
表达式
ship?.GetComponent...
的返回类型是EventTrigger
(可空)等同于
Nullable<EventTrigger>
性能:
编译器会优化为条件检查
比手动写 if-null-check 更简洁但性能相当
Unity 版本要求:
需要 C# 6.0+(Unity 2018.3+ 完全支持)
老版本 Unity 需手动检查 null
建议在 Unity 开发中多用此运算符,尤其在获取可能被销毁的对象引用时,能有效减少空引用异常。
DeepSeek生成