Evitare classi interne prive di istanze
Aggiornamento: novembre 2007
TypeName |
AvoidUninstantiatedInternalClasses |
CheckId |
CA1812 |
Category |
Microsoft.Performance |
Breaking Change |
Non Breaking |
Causa
Un'istanza di un tipo a livello di assembly non viene creata dal codice all'interno dell'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.
Se si applica System.Runtime.CompilerServices.InternalsVisibleToAttribute all'assembly che si sta analizzando, questa regola non funzionerà su 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 del codice di Visual Studio, viene generato FxCop autonomo esterno su costruttori interni se ogni assembly friend è presente nell'analisi.
Correzione di 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.
Modificatore static 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 da ASP.NET. Ad esempio, 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
Evitare il codice privato non chiamato