Sdílet prostřednictvím


CA1812: Vyhněte se nevytvořeným instancím vnitřních tříd

Vlastnost Hodnota
ID pravidla CA1812
Název Vyhněte se nevytvořeným instancím interních tříd
Kategorie Výkon
Oprava způsobující chybu nebo chybu způsobující chybu Nenarušující
Povoleno ve výchozím nastavení v .NET 8 No

Příčina

Interní typ (na úrovni sestavení) se nikdy nesrovná.

Popis pravidla

Toto pravidlo se pokusí najít volání jednoho z konstruktorů typu a hlásí porušení, pokud se nenajde žádné volání.

Toto pravidlo nezkoumá následující typy:

  • Typy hodnot
  • Abstraktní typy
  • Výčty
  • Delegáti
  • Typy polí generovaných kompilátorem
  • Typy, které nelze vytvořit instanci a které definují static pouze metody.

Pokud použijete System.Runtime.CompilerServices.InternalsVisibleToAttribute pro analyzované sestavení, toto pravidlo ve výchozím nastavení neoznačuje typy, které jsou ve Visual Basicu označené jako internal (Friend v jazyce Visual Basic), protože pole může být použito přátelským sestavením. Chcete-li přesto analyzovat sestavení, přečtěte si téma Konfigurace kódu pro analýzu.

Jak opravit porušení

Chcete-li opravit porušení tohoto pravidla, odeberte typ nebo přidejte kód, který ho používá. Pokud typ obsahuje pouze static metody, přidejte static modifikátor do typu, aby zabránil kompilátoru v generování výchozího konstruktoru veřejné instance.

Kdy potlačit upozornění

Je bezpečné potlačit upozornění z tohoto pravidla. Toto upozornění doporučujeme potlačit v následujících situacích:

  • Třída se vytváří prostřednictvím metod reflexe s pozdní vazbou, například System.Activator.CreateInstance.

  • Třída je zaregistrována v kontejneru Inversion of Control (IoC) jako součást vzoru injektáže závislostí.

  • Třída je vytvořena automaticky modulem runtime nebo ASP.NET. Mezi příklady automaticky vytvořených tříd patří ty, které implementují System.Configuration.IConfigurationSectionHandler nebo System.Web.IHttpHandler.

  • Třída se používá jako parametr typu v definici třídy a má new omezení. Následující příklad bude označen příznakem pravidla CA1812:

    internal class MyClass
    {
        public void DoSomething()
        {
        }
    }
    public class MyGeneric<T> where T : new()
    {
        public T Create()
        {
            return new T();
        }
    }
    
    MyGeneric<MyClass> mc = new MyGeneric<MyClass>();
    mc.Create();
    

Potlačení upozornění

Pokud chcete pouze potlačit jedno porušení, přidejte do zdrojového souboru direktivy preprocesoru, abyste pravidlo zakázali a znovu povolili.

#pragma warning disable CA1812
// The code that's violating the rule is on this line.
#pragma warning restore CA1812

Pokud chcete pravidlo pro soubor, složku nebo projekt zakázat, nastavte jeho závažnost v none konfiguračním souboru.

[*.{cs,vb}]
dotnet_diagnostic.CA1812.severity = none

Další informace naleznete v tématu Jak potlačit upozornění analýzy kódu.

Konfigurace kódu pro analýzu

Pomocí následující možnosti nakonfigurujte, ve kterých částech základu kódu se má toto pravidlo spouštět.

Tuto možnost můžete nakonfigurovat jenom pro toto pravidlo, pro všechna pravidla, která platí, nebo pro všechna pravidla v této kategorii (Výkon), na která platí. Další informace naleznete v tématu Možnosti konfigurace pravidla kvality kódu.

Ignorovat atribut InternalsVisibleTo

Ve výchozím nastavení je toto pravidlo zakázáno, pokud analyzované sestavení používá InternalsVisibleToAttribute k zveřejnění svých vnitřních symbolů. Chcete-li určit, že pravidlo by se mělo spustit i v případě, že je sestavení označeno InternalsVisibleToAttribute, přidejte do souboru .editorconfig v projektu následující dvojici klíč-hodnota:

dotnet_code_quality.CAXXXX.ignore_internalsvisibleto = true

Tato možnost je dostupná od verze .NET 8.