是否应该使用UsedImplicitly属性注释Unity生命周期方法?


9

使用UsedImplicitly属性注释Unity生命周期方法是否可以提高代码的可读性?

例如:

public class Example : MonoBehaviour
{
    [UsedImplicitly]
    private void Awake()
    {
        DoSomething();
    }

    private void DoSomething()
    {
        // ...
    }
}

这篇关于“构建Unity MonoBehaviours”的博客文章建议将此方法作为有用的约定。

  1. 使用[UsedImplicitly]属性注释代码中隐式(或自动)调用的所有Unity生命周期方法(开始,唤醒,更新,OnDestroy等),事件方法和其他函数。尽管此属性包含在UnityEngine.dll中,但ReSharper使用它来为似乎未引用的方法禁用代码清除建议。它还有助于使刚接触Unity和您的代码库的人更容易阅读代码,尤其是对于通过检查器引用的事件。

(注意:我不认为ReSharper会为看似未引用的Unity生命周期方法显示代码清理建议,因此这可能已过时。)

我同意上面的帖子,这对于那些对Unity较新的人可能会有帮助。我还认为这可能是标记那些有用的统一生命周期的功能不被使用的频繁程度AwakeStart以及Update。但是我想知道这是否真的是“干净代码”的良好约定,还是仅仅是噪音降低了可读性。


1
我已经在Unity中发布了2款游戏,但不知道它是否存在。如果我这样做了,我可能会用它来说明清楚,并且不会认为它是噪音。
McAden

1
嗨,我是该帖子的原始作者。是的,我认为这对于生命周期方法可能是过大的,尤其是考虑到Resharper支持的改进。但是我认为注释仅通过检查器引用的事件回调(例如,对于动画和Unity的UI事件系统)很有用。但是,这取决于管理代码库的人员-当我写这篇文章时,我在一家软件咨询公司工作,没有人拥有游戏开发经验,因此我想在我们之间建立一个标准。回想起来,这有点过分苛刻,因为我没想到该帖子会引起关注。
Mana '18

Answers:


10

这取决于目标人群。

在上面的示例中,目标人群是ReSharper工具,该工具从这些属性中受益,因为它可以抑制对您没有帮助的消息。但是,如果您不需要使用ReSharper或类似工具(尽管也许应该,他们有时会提出一些有效的批评意见),那么您就不必关心该人口统计信息了。

曾经做过基本的Unity教程的任何人都非常了解这一点,Start并且Update被Unity引擎隐式使用,因此它不会为他们提供任何新信息。如果您忘记了一次,实际上可能会使他们困惑。你想说什么?这可能实际上不是MonoBehaviour吗?还是有一些晦涩的原因为什么您必须显式地调用它(我不知道)?

但是,如果您与经验不足的开发人员一起工作,而这些开发人员可能不熟悉更深奥的Unity事件Reset(例如(危险,因为显式调用它可能无法执行您认为的事情),那么它会有所帮助)。[UsedImplicitly]然后,该属性可能会告诉他们他们不需要寻找调用该方法的类,因为引擎会这样做。但是,只有当您有纪律性地做到这一点时,这才有价值。如果您有足够的自律能力,那么您也可以同意添加评论。


1
我会添加“对于99%的人口统计没有任何好处”。甚至几个小时后的初学者也将开始认识生命周期方法(在VS中,它们的颜色不同!)。转售商是:昂贵的许可证,可以重新配置,并且正如OP所说的,它可能已经被修补了。我认为,与用可争论的价值的属性来装饰每一秒钟的方法相比,可以更有效地花费时间。
温德拉

@wondra感谢您指出在Visual Studio中它们的颜色不同。我将尝试弄清楚为什么即使将Visual Studio 2017 Tools -> Options -> Tools for Unity -> General -> Unity Messages syntax highlighting设置为true ,它也不能为我做到这一点。
桑尼

1
我没有研究为什么Visual Studio没有为Unity方法着色,但是另一个答案指出ReSharper有一个Unity插件,该插件还可以自动识别Unity事件函数。也有以下相关设置:ReSharper -> Options -> Code Inspection -> Settings -> Enable code analysis -> Color identifiers
桑尼

6

我认为不,您不应该使用它。

UsedImplicitly属性来自Jetbrains.Annotations命名空间,因此唯一适用的情况是,所有使用该代码的人都将使用ReSharper。

ReSharper有一个Unity插件,已经为您处理了这个问题,确保不仅删除警告,不要使用它们,还用一个Unity符号标记它们,以便任何阅读代码的人都可以看到它们已被Unity本身调用。

当使用它们可能会出错时,我还想添加一个示例。假设您有一个从MonoBehaviour继承的类,但是在重构之后,它不再具有任何继承。如果您用[UsedImplicitly]标记了私有方法,那么您将不会收到正确的警告。如果您使用Unity插件进行共享,则会注意到您不再继承MonoBehaviour,并且由于不再调用方法而将发出警告。


1
我不知道ReSharper插件存在,感谢您指出!
桑尼

1
请注意,从Unity 5开始,Unity已开始在UnityEngine.dll中包括ReSharper属性-请参阅此论坛帖子
桑尼

5

我会说它真的不会伤害。

对于非常熟悉Unity工作原理的人来说,它可能不会添加任何内容。这些人已经非常熟悉Unity的运行时代表您调用的内容。

但是对于像我这样的人而言,这可能会有所帮助。即使我不知道这意味着什么,我也会去查找它,这可能足以让我更好地了解代码中正在发生的事情。

另外,如果确实使用了对方法有错误警告的静态分析工具,则您将希望以某种方式使这些警告静音,因为“可忽略”的警告噪音使在任何此类输出中都很难看到真实的警告。通常最好以外科手术,局部化的方式来忽略此类警告(在这种情况下,通过用属性装饰犯罪方法),而不是通过更广泛的措施(例如在整个项目中禁用该特定警告)来忽略此类警告。


1
感谢您的回答。发布问题时,我的想法与您的答案类似,但我同意其他发布者的观点,他们指出,如果未一致使用属性,可能会产生误导。
桑尼

3
是的,这些都是公平的观点。如果确实有人对此进行了静态分析,并且认真对待了这些警告,则可以帮助您确保属性被统一应用。但是,如果您不这样做呢?那么,这完全取决于人为错误。

2

这种方法的问题在于它极容易出错。

如果不可靠,则标签将无法传达有用的信息,标签的存在或缺失有时会成功传达虚假信息,这是有害的。

如果决定使用它,则必须消除人为错误,这并非难事,但是如果您以前没有做过这样的事情,则需要花费2个小时的工作。有2种方法-每种都有自己的优势-您可以使用其中一种:

  1. 在签入或自动生成时验证并拒绝不符合要求的代码。
  2. 自动编辑代码以修复签入或自动构建中的标签。

值得拥有吗?是。值得您花费2个小时的时间吗?您的来电。


1
我接受了一个不同的答案,但是您对于消除任何人为考虑使用此UsedImplicitly属性的人为错误提出了很大的建议。
桑尼
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.