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()
{
}
};
}