Classes tagged with InitializeOnLoad should have a static constructor
InitializeOnLoadAttribute initializes an Editor class when Unity loads and when scripts are recompiled; the tagged class's static constructor is responsible for the initialization.
How to fix
Create a static constructor for the matched classes.
CQLinq source
This rule is written in CQLinq, C# LINQ over the NDepend code model. It ships with every new NDepend project: you can read it, adapt it, or use it as a starting point for your own custom rules.
// <Name>Classes tagged with InitializeOnLoad should have a static constructor</Name>
// <Id>ND3200:ClassesTaggedWithInitializeOnLoadShouldHaveAStaticConstructor</Id>
warnif count > 0
from t in Application.Types where t.HasAttribute("UnityEditor.InitializeOnLoadAttribute".AllowNoMatch())
where !t.Name.Contains("Readme") && // Discard false positive on generated code
t.Methods.SingleOrDefault(m => m.IsClassConstructor) == null
select new {
t,
Debt = 8.ToMinutes().ToDebt(),
Severity = Severity.Medium
}
//<Expl>
// The *{0}* is tagged with *InitializeOnLoadAttribute* and thus,
// should have a static constructor to initialize the *Editor* class.
//</Expl>
//<Desc>
// *InitializeOnLoadAttribute* initializes an Editor class when Unity loads
// and when scripts are recompiled; the tagged class's static constructor is
// responsible for the initialization.
//</Desc>
//<HowToFix>
// Create a static constructor for the matched classes.
//</HowToFix>
Open in the interactive Rules Explorer · All default rules
API Usage / Unity: all 9 items
- Classes tagged with InitializeOnLoad should have a static constructor ND3200
- Avoid using non-generic GetComponent ND3201
- Avoid empty Unity message ND3202
- Avoid using Time.fixedDeltaTime with Update ND3203
- Use CreateInstance to create a scriptable object ND3204
- The SerializeField attribute is redundant on public fields ND3205
- InitializeOnLoadMethod should tag only static and parameterless methods ND3206
- Prefer using SetPixels32() over SetPixels() ND3207
- Don't use System.Reflection in performance critical messages ND3208