gpt4 book ai didi

c# - 为什么 ReSharper 不建议对这两个 block 使用空传播?

转载 作者:行者123 更新时间:2023-12-03 15:13:29 27 4
gpt4 key购买 nike

ReSharper 建议对“可损坏”if block 使用空传播,但对于“forceVelocityCalculator”则没有建议。

void Damage(Collider hitCollider)
{
var damageable = hitCollider.GetComponent<IDamageable>();

if (damageable != null)
{
damageable.TakeDamage(_damage);
}
}

void Push(Collider hitCollider)
{
var forceVelocityCalculator = hitCollider.GetComponent<ForceVelocityCalculator>();

if (forceVelocityCalculator != null)
{
forceVelocityCalculator.Push(_pushForce, GameAPI.playerTransform.transform.forward);
}
}
我错过了什么吗?我将对这两个 block 使用空传播。

最佳答案

Unity 提供 blog post关于这个话题,但下面是一个简短的总结。

您的组件继承自 Unity 对象的空值传播是不正确的。 Resharper 不建议这样做,Visual Studio 2019 会发出警告。

为什么会出现 IDamageable 的建议? ?因为它是一个接口(interface)。 IDE(代码编辑器)不知道此接口(interface)实例的类型。它不能知道IDamageable继承自 UnityEngine.Object ,所以没有建议出现。 ForceVelocityCalculator但是,继承自 MonoBehaviourScriptableObject , 两者都继承自 UnityEngine.Object .
这很重要,因为 Unity 自定义了 ==运算符(operator)。这样一来,你习惯的默认相等比较就不会发生了。

博客文章给出了这个决定的两个原因:

  • 在编辑器中,Unity 有自己的 null 概念。 MonoBehaviour 的未初始化字段被赋予这个 Unity 特定的空值。这与自定义 == 相结合运算符(operator),让 Unity 在您开发时向您(开发人员)提供附加信息。而不是收到 NullReferenceException和标准堆栈跟踪,您会收到一个增强的堆栈跟踪以及一些指示 GameObject问题存在。博客文章提到了一个简洁的功能,他们突出了有问题的 GameObject在层次结构 Pane 中。
  • 由于 Unity 是一个 C/C++ 引擎并且您使用 C# 编写脚本,您可以认为您的 C# 对象“包装”了 C++ 对象。有关该游戏对象的所有信息(附加组件、HideFlags 等)都在 C++ 对象中。此外,这些 C++ 对象的生命周期是明确管理的。这就是您使用 Object.Destroy() 的原因而不是将事物设置为空。定制==运算符解决了 C++ 对象已被销毁但“包装”C# 对象仍然存在的情况。在这种情况下,CSharpObject == null返回 true,即使您的 C# 对象在技术上不为空。
  • 关于c# - 为什么 ReSharper 不建议对这两个 block 使用空传播?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58487442/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com