CA1812: Vyhněte se nevytvořeným instancím vnitřních tříd
TypeName |
AvoidUninstantiatedInternalClasses |
CheckId |
CA1812 |
Kategorie |
Microsoft.Performance |
Narušující změna |
Nenarušující |
Příčina
Instance typu na úrovni sestavení není vytvořena kódem v sestavení.
Popis pravidla
Toto pravidlo se pokouší nalézt volání jednoho z konstruktorů typu a ohlásí porušení, jestliže není nalezeno žádné volání.
Následující typy nejsou tímto pravidlem zkoumány:
Hodnotové typy
Abstraktní typy
Výčty
Delegáti
Typy polí šířené kompilátorem
Typy, které nemohou být instancovány a které definují pouze metody typu static (v jazyce Visual Basic Shared)
Jestliže je na sestavení, které je analyzováno, aplikován atribut InternalsVisibleToAttribute, neobjeví se toto pravidlo v žádném konstruktoru, který je označen jako internal, jelikož nelze říci, zdali není proměnná používána jiným sestavením friend.
Přestože nelze toto omezení v nástroji Code Analysis sady Visual Studio obejít, externí samostatná aplikace FxCop se ve vnitřních konstruktorech objeví, jestliže je v analýze k dispozici každé sestavení friend.
Jak vyřešit porušení
Pro vyřešení porušení tohoto pravidla je nutné odebrat typ nebo přidat kód, který jej používá.Jestliže typ obsahuje pouze statické metody, je potřeba typu přidat některý z následujících prvků, aby bylo překladači zabráněno v šíření výchozího veřejného konstruktoru:
Privátní konstruktor pro typy cílené na .NET Framework verze 1.0 a 1.1.
Modifikátor static (v jazyce Visual Basic Shared) pro typy cílené na .NET Framework 2,0.
Kdy potlačit upozornění
Upozornění tohoto pravidla lze bezpečně potlačit.Doporučujeme toto varování potlačit v následujících situacích:
Třída je vytvořena prostřednictvím reflexních metod s pozdní vazbou, jako je například metoda CreateInstance.
Třída je automaticky vytvořena modulem runtime, nebo ASP.NET.Například se jedná o třídy implementující IConfigurationSectionHandler nebo IHttpHandler.
Třída je předána jako parametr generického typu, který má nové omezení.Následuje příklad vyvolávající toto pravidlo.
internal class MyClass { public DoSomething() { } } public class MyGeneric<T> where T : new() { public T Create() { return new T(); } } // [...] MyGeneric<MyClass> mc = new MyGeneric<MyClass>(); mc.Create();
V těchto situacích doporučujeme toto upozornění potlačit.
Související pravidla
CA1811: Vyhněte se nevolanému místnímu kódu