Sdílet prostřednictvím


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

CA1801: Zkontrolujte nepoužité parametry

CA1804: Odeberte nepoužívané místní hodnoty