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