为什么ReSharper不建议对这两个块都使用空传播?

抽奖

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

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

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

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

    if (forceVelocityCalculator != null)
    {
        forceVelocityCalculator.Push(_pushForce, GameAPI.playerTransform.transform.forward);
    }
}

我想念什么吗?我将对两个块都使用空传播。

特雷特尼

Unity提供了有关该主题博客文章,但下面是简短摘要。

组件继承的Unity对象上的空传播是错误的。Resharper建议不要这样做,Visual Studio 2019会对此发出警告。

为什么会出现此建议IDamageable因为它是一个界面。IDE(代码编辑器)不知道此接口的实例的类型。它不知道IDamageable继承自UnityEngine.Object,因此没有建议。ForceVelocityCalculator但是,继承自MonoBehaviourScriptableObject,两者都继承自UnityEngine.Object这很重要,因为Unity已定制了==操作员。这样,您习惯的默认相等比较就不会发生。

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

  1. 在编辑器中,Unity具有其自己的null概念。MonoBehavioura的未初始化字段提供了这个特定于Unity的空值。结合自定义==运算符,它可以使Unity在您开发时向开发人员提供其他信息。而不是接收NullReferenceException标准堆栈跟踪,而是接收增强的堆栈跟踪以及某些指示GameObject问题存在的指示该博客文章提到了一个简洁的功能,该功能GameObject在“层次结构”窗格中突出显示了问题所在

  2. 由于Unity是C / C ++引擎,并且您使用C#编写脚本,因此您可以想到C#对象可以“包装” C ++对象。有关该GameObject的所有信息(附加的组件,HideFlags等)都在C ++对象中。同样,这些C ++对象的生存期也得到明确管理。这就是为什么您使用Object.Destroy()而不是将事物设置为null的原因。定制==运算符解决了C ++对象已被破坏但“包装” C#对象仍然存在的情况。在这种情况下,CSharpObject == null即使您的C#对象在技术上不为null,也返回true。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么这两个内联块不对齐?

来自分类Dev

为什么这两个div不能充当块?

来自分类Dev

为什么这两个div元素使用显示内联块不与顶部对齐;垂直对齐:顶部?

来自分类Dev

为什么Scala编译器会不同地对待这两个代码块?

来自分类Dev

php 中的静态,为什么它对两个类都使用一个缓存

来自分类Dev

这两个代码块有什么区别?

来自分类Dev

CSS:为什么这两个div(或span)元素彼此不浮动

来自分类Dev

Erlang-为什么这两个表达式不匹配?

来自分类Dev

为什么这两个空数组的填充方式不同?

来自分类Dev

为什么连续两个页面都使用segue打开

来自分类Dev

为什么两个div都使用相同的颜色?只有1定义为绿色

来自分类Dev

为什么在TableColumn <T,S>中对两个通用类型都使用相同的通用类型?

来自分类Dev

为什么我的两个虚拟机都使用相同的IP地址?

来自分类Dev

为什么这两个任务定义语法等效?

来自分类Dev

JavaScript日期:为什么这两个日期不同?

来自分类Dev

为什么这两个变量在JavaScript中相等?

来自分类Dev

为什么这两个指针访问相同的元素?

来自分类Dev

为什么这两个变量在NASM中同步

来自分类Dev

这两个为什么不相等?

来自分类Dev

为什么这两个等价物?

来自分类Dev

为什么这两个DOMDocument函数的行为不同?

来自分类Dev

为什么这两个代码给出的结果相同?

来自分类Dev

为什么不能将这两个变量相除?

来自分类Dev

为什么这两个FParsec片段不同?

来自分类Dev

为什么这两个警报显示不同的值?

来自分类Dev

这两个关系为什么成立?

来自分类Dev

为什么这两个指针访问相同的元素?

来自分类Dev

为什么这两个“ cat”命令的结果不同?

来自分类Dev

为什么这两个代码给出不同的输出

Related 相关文章

  1. 1

    为什么这两个内联块不对齐?

  2. 2

    为什么这两个div不能充当块?

  3. 3

    为什么这两个div元素使用显示内联块不与顶部对齐;垂直对齐:顶部?

  4. 4

    为什么Scala编译器会不同地对待这两个代码块?

  5. 5

    php 中的静态,为什么它对两个类都使用一个缓存

  6. 6

    这两个代码块有什么区别?

  7. 7

    CSS:为什么这两个div(或span)元素彼此不浮动

  8. 8

    Erlang-为什么这两个表达式不匹配?

  9. 9

    为什么这两个空数组的填充方式不同?

  10. 10

    为什么连续两个页面都使用segue打开

  11. 11

    为什么两个div都使用相同的颜色?只有1定义为绿色

  12. 12

    为什么在TableColumn <T,S>中对两个通用类型都使用相同的通用类型?

  13. 13

    为什么我的两个虚拟机都使用相同的IP地址?

  14. 14

    为什么这两个任务定义语法等效?

  15. 15

    JavaScript日期:为什么这两个日期不同?

  16. 16

    为什么这两个变量在JavaScript中相等?

  17. 17

    为什么这两个指针访问相同的元素?

  18. 18

    为什么这两个变量在NASM中同步

  19. 19

    这两个为什么不相等?

  20. 20

    为什么这两个等价物?

  21. 21

    为什么这两个DOMDocument函数的行为不同?

  22. 22

    为什么这两个代码给出的结果相同?

  23. 23

    为什么不能将这两个变量相除?

  24. 24

    为什么这两个FParsec片段不同?

  25. 25

    为什么这两个警报显示不同的值?

  26. 26

    这两个关系为什么成立?

  27. 27

    为什么这两个指针访问相同的元素?

  28. 28

    为什么这两个“ cat”命令的结果不同?

  29. 29

    为什么这两个代码给出不同的输出

热门标签

归档