CA2104: Non dichiarare tipi di riferimento modificabili in sola lettura

Articolo Valore
ID regola CA2104
Category Microsoft.Security
Modifica Nessuna interruzione

Nota

La regola CA2104 è obsoleta e verrà rimossa in una versione futura di Visual Studio. Non verrà implementata come analizzatore a causa dell'analisi complessa necessaria per determinare l'effettiva immutabilità di un tipo.

Causa

Un tipo visibile esternamente contiene un campo in sola lettura visibile esternamente che costituisce un tipo di riferimento modificabile.

Nota

Questa regola è stata deprecata. Per altre informazioni, vedere Regole deprecate.

Descrizione regola

Un tipo modificabile è un tipo i cui dati di istanza possono essere modificati. La System.Text.StringBuilder classe è un esempio di tipo riferimento modificabile. Contiene membri che possono modificare il valore di un'istanza della classe . Un esempio di tipo riferimento non modificabile è la System.String classe . Dopo che è stata creata un'istanza, il valore non può mai cambiare.

Il modificatore di sola lettura (readonly in C#, ReadOnly in Visual Basic e const in C++) su un campo di tipo riferimento (o C++un puntatore in) impedisce che il campo venga sostituito da un'istanza diversa del tipo di riferimento. Tuttavia, il modificatore non impedisce la modifica dei dati dell'istanza del campo tramite il tipo di riferimento.

Questa regola può inavvertitamente mostrare una violazione per un tipo che, di fatto, non è modificabile. In questo caso, è possibile eliminare l'avviso.

I campi di matrice di sola lettura sono esenti da questa regola, ma causano invece una violazione dei campi CA2105: i campi matrice non devono essere di sola lettura.

Come correggere le violazioni

Per correggere una violazione di questa regola, rimuovere il modificatore di sola lettura o, se una modifica di rilievo è accettabile, sostituire il campo con un tipo non modificabile.

Quando eliminare gli avvisi

È possibile eliminare un avviso da questa regola se il tipo di campo non è modificabile.

Esempio

Nell'esempio seguente viene illustrata una dichiarazione di campo che causa una violazione di questa regola:

using System;
using System.Text;

namespace SecurityLibrary
{
    public class MutableReferenceTypes
    {
        static protected readonly StringBuilder SomeStringBuilder;

        static MutableReferenceTypes()
        {
            SomeStringBuilder = new StringBuilder();
        }
    }
}