Condividi tramite


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

CA1801: Rivedere i parametri inutilizzati

CA1804: rimuovere locali non utilizzati