Condividi tramite


CA2104: Non dichiarare tipi di riferimento modificabili in sola lettura

TypeName

DoNotDeclareReadOnlyMutableReferenceTypes

CheckId

CA2104

Category

Microsoft.Security

Breaking Change

Non sostanziale

Causa

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

Descrizione della regola

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

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

I campi di matrici in sola lettura non sono interessati questa regola, ma causano invece una violazione della regola CA2105: I campi di matrici non devono essere di sola lettura.

Come correggere le violazioni

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

Esclusione di avvisi

L'esclusione di un avviso da questa regola è sicura se il tipo di campo non è modificabile.

Esempio

Nell'esempio riportato di seguito viene illustrata una dichiarazione di campo che causa una violazione di questa regola.

Imports System
Imports System.Text

Namespace SecurityLibrary

    Public Class MutableReferenceTypes

        Shared Protected ReadOnly SomeStringBuilder As StringBuilder

        Shared Sub New()
            SomeStringBuilder = New StringBuilder()
        End Sub

    End Class

End Namespace
using System;
using System.Text;

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

        static MutableReferenceTypes()
        {
            SomeStringBuilder = new StringBuilder();
        }
    }
}
using namespace System;
using namespace System::Text;

namespace SecurityLibrary
{
    public ref class MutableReferenceTypes
    {
    protected:
        static StringBuilder^ const SomeStringBuilder = 
           gcnew StringBuilder();

    private:
        static MutableReferenceTypes()
        {
        }
    };
}