CA1812: Uniknąć bez wystąpień klas wewnętrznych
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 System.Runtime.CompilerServices.InternalsVisibleToAttribute do zestawu, który jest analizowany, ta reguła nie wystąpi dla dowolego 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 .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 System.Configuration.IConfigurationSectionHandler lub System.Web.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: Uniknąć nienależne kod prywatnych