CA1812: Evitare classi interne prive di istanze
TypeName |
AvoidUninstantiatedInternalClasses |
CheckId |
CA1812 |
Category |
Microsoft.Performance |
Breaking Change |
Non sostanziale |
Causa
Un'istanza di un tipo a livello di assembly non viene creata dal codice nell'assembly.
Descrizione della regola
Mediante questa regola si tenta di individuare una chiamata a uno dei costruttori del tipo e viene segnalata una violazione se non viene trovata alcuna chiamata.
I tipi riportati di seguito non vengono esaminati da questa regola:
Tipi di valore
Tipi astratti
Enumerazioni
Delegati
Tipi di matrice creati dal compilatore
Tipi di cui non è possibile creare istanze e che definiscono soltanto metodi static (Shared in Visual Basic).
Se si applica System.Runtime.CompilerServices.InternalsVisibleToAttribute all'assembly che si sta analizzando, questa regola non si verificherà in qualsiasi costruttore contrassegnato come internal poiché non è possibile stabilire se un campo è utilizzato da un altro assembly friend.
Sebbene non sia possibile aggirare questa limitazione nell'analisi codice di Visual Studio, il codice FxCop autonomo esterno verrà eseguito sui costruttori interni, se ogni assembly friend è presente nell'analisi.
Come correggere le violazioni
Per correggere una violazione di questa regola, rimuovere il tipo o aggiungere il codice che lo utilizza. Se il tipo contiene solo metodi statici, aggiungere uno degli elementi riportati di seguito al tipo per impedire che il compilatore crei un costruttore di istanza pubblico predefinito:
Costruttore privato per i tipi destinati a .NET Framework versioni 1.0 e 1.1.
Il modificatore static (Shared in Visual Basic) per i tipi destinati a .NET Framework 2.0.
Esclusione di avvisi
L'esclusione di un avviso da questa regola è sicura. Si consiglia di eliminare questo avviso nelle situazioni seguenti:
La classe viene creata tramite metodi reflection ad associazione tardiva ad esempio CreateInstance.
La classe viene creata automaticamente dal runtime o ASP.NET. Ad esempio, le classi che implementano System.Configuration.IConfigurationSectionHandler o System.Web.IHttpHandler.
La classe viene passata come un parametro di tipo generico con un nuovo vincolo. Ad esempio, di seguito verrà attivata questa regola.
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();
In queste situazioni si consiglia di eliminare l'avviso.
Regole correlate
CA1811: Evitare il codice privato non chiamato