Condividi tramite


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

Rivedere i parametri inutilizzati

Rimuovere locali non utilizzati