ReSharper 2026.1 Help

代码检查:使用 'CompareTag' 而不是显式字符串比较。

tag 属性返回一个字符串值,可用于标识一个或多个游戏对象(参见 标签的详细文档)。 但是,每次访问该属性时都会发生一次分配,因为该字符串会从 Unity 的本地对象复制到托管的 C# 字符串中。

此检查会突出显示对 tag 的显式字符串比较,例如:

if (gameObject.tag == "Tank")

还提供了一个快速修复,将此比较转换为对 CompareTag(string) 的调用,这是一个原生 Unity 引擎方法调用,因此避免了内存分配:

if (gameObject.CompareTag("Tank"))

但需要注意的是, CompareTag 在行为上有细微差别——运行时会检查标签是否存在,如果不存在则会在 Unity 控制台报告错误。 这并不是 Unity 政策的变更——标签应该在使用前就已存在——但简单的字符串相等性比较无法进行此类检查。

详情请参见 Unity 的 《在 Unity 游戏中优化垃圾回收》 中的 CompareTag 一节,以及 Unity 论坛上的此答案

2026年 5月 8日