Udostępnij za pośrednictwem


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

Właściwości Wartość
Identyfikator reguły CA1812
Tytuł Unikaj klas wewnętrznych bez wystąpień
Kategoria Wydajność
Poprawka powodująca niezgodność lub niezgodność Niezgodność
Domyślnie włączone na platformie .NET 9 Nie.

Przyczyna

Typ wewnętrzny (poziom zestawu) nigdy nie jest tworzone.

Opis reguły

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

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

  • Typy wartości
  • Typy abstrakcyjne
  • Wyliczenia
  • Delegaci
  • Typy tablic emitowanych przez kompilator
  • Typy, których nie można utworzyć, i które definiują static tylko metody.

Jeśli zastosujesz się System.Runtime.CompilerServices.InternalsVisibleToAttribute do zestawu, który jest analizowany, ta reguła nie flaguje typów oznaczonych jako internal (Friend w Visual Basic), ponieważ pole może być używane przez zestaw znajomy. Aby mimo to przeanalizować zestaw, zobacz Konfigurowanie kodu do analizy.

Jak naprawić naruszenia

Aby naprawić naruszenie tej reguły, usuń typ lub dodaj kod, który go używa. Jeśli typ zawiera tylko static metody, dodaj static modyfikator do typu, aby uniemożliwić kompilatorowi emitowanie domyślnego konstruktora wystąpienia publicznego.

Kiedy pomijać ostrzeżenia

Można bezpiecznie pominąć ostrzeżenie z tej reguły. Zalecamy pominięcie tego ostrzeżenia w następujących sytuacjach:

  • Klasa jest tworzona za pomocą metod odbicia z opóźnieniem, takich jak System.Activator.CreateInstance.

  • Klasa jest rejestrowana w kontenerze inwersji kontroli (IoC) w ramach wzorca wstrzykiwania zależności.

  • Klasa jest tworzona automatycznie przez środowisko uruchomieniowe lub ASP.NET. Niektóre przykłady automatycznie utworzonych klas to te, które implementują System.Configuration.IConfigurationSectionHandler program lub System.Web.IHttpHandler.

  • Klasa jest używana jako parametr typu w definicji klasy i ma new ograniczenie. Poniższy przykład będzie oflagowany przez regułę 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();
    

Pomijanie ostrzeżenia

Jeśli chcesz po prostu pominąć pojedyncze naruszenie, dodaj dyrektywy preprocesora do pliku źródłowego, aby wyłączyć, a następnie ponownie włączyć regułę.

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

Aby wyłączyć regułę dla pliku, folderu lub projektu, ustaw jego ważność na none w pliku konfiguracji.

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

Aby uzyskać więcej informacji, zobacz Jak pominąć ostrzeżenia dotyczące analizy kodu.

Konfigurowanie kodu do analizowania

Użyj następującej opcji, aby skonfigurować, które części bazy kodu mają być uruchamiane w tej regule.

Tę opcję można skonfigurować tylko dla tej reguły, dla wszystkich reguł, do których ma ona zastosowanie, lub dla wszystkich reguł w tej kategorii (wydajność), których dotyczy. Aby uzyskać więcej informacji, zobacz Opcje konfiguracji reguły jakości kodu.

Ignoruj atrybut InternalsVisibleTo

Domyślnie ta reguła jest wyłączona, jeśli analizowany zestaw używa InternalsVisibleToAttribute do uwidocznienia jego symboli wewnętrznych. Aby określić, że reguła powinna być uruchamiana nawet wtedy, gdy zestaw jest oznaczony za pomocą InternalsVisibleToAttributepolecenia , dodaj następującą parę klucz-wartość do pliku editorconfig w projekcie:

dotnet_code_quality.CAXXXX.ignore_internalsvisibleto = true

Ta opcja jest dostępna począwszy od platformy .NET 8.