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