Udostępnij za pośrednictwem


CA1812: Unikaj wewnętrznych klas bez wystąpień

TypeName

AvoidUninstantiatedInternalClasses

CheckId

CA1812

Kategoria

Microsoft.Performance

Zmiana kluczowa

Niekluczowa

Przyczyna

Wystąpienie typu na poziomie zestawu nie jest tworzone przez kod w zestawie.

Opis reguły

Ta reguła usiłuje zlokalizować wywołanie do jednego z konstruktorów typu i zgłasza naruszenie, jeśli wywołanie nie zostanie znalezione.

Następujące typy nie są badane przez tę regułę:

  • Typy wartościowe.

  • Typy abstrakcyjne

  • Wyliczenia

  • Obiekty delegowane

  • Typy tablicowe emitowane przez kompilator

  • Typy, dla których nie można utworzyć wystąpienia w związku z czym definiują tylko metody static (Shared w języku Visual Basic).

Jeśli zastosujesz InternalsVisibleToAttribute do zestawu, który jest analizowany, ta reguła nie wystąpi dla dowolnego konstruktora oznaczonego jako internal , ponieważ nie można sprawdzić, czy pole jest używany przez inny zestaw friend.

Mimo że nie można obejść tego ograniczenia w Analizie Kodu Visual Studio, zewnętrzny samodzielny FxCop wystąpi na wewnętrznych konstruktorach jeśli każdy zestaw friend jest obecny w analizie.

Jak naprawić naruszenia

Aby naprawić naruszenie tej zasady, usuń typ lub dodaj kod, który go używa.Jeśli typ zawiera tylko metody statyczne, dodać jeden z następujących do typu, aby uniemożliwić kompilatorowi emitowanie domyślnego konstruktora wystąpienia publicznego:

  • Prywatny konstruktor dla typów tworzonych dla .NET Framework w wersji 1.0 i 1.1.

  • Modyfikator static (Shared w języku Visual Basic) dla typów tworzonych dla Program .NET Framework 2,0.

Kiedy pominąć ostrzeżenia

Bezpiecznie jest pomijać ostrzeżenia dotyczące tej zasady.Firma Microsoft zaleca, aby pominąć to ostrzeżenie w następujących sytuacjach:

  • Klasa jest tworzona poprzez metody odbijające z późnym wiązaniem takie jak CreateInstance.

  • Klasa jest tworzona automatycznie w czasie wykonywania lub ASP.NET.Na przykład klasy implementujące IConfigurationSectionHandler lub IHttpHandler.

  • Klasa jest przekazywana jako parametr typu generycznego, który ma nowe ograniczenie.Na przykład poniższy przykład wzbudzi tę regułę.

    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();
    

W takich sytuacjach zaleca się, że pominąć to ostrzeżenie.

Powiązane reguły

CA1811: Unikaj niewywołanego kodu prywatnego

CA1801: Przejrzyj nieużywane parametry

CA1804: Usuń nieużywane zmienne lokalne