CA2104: No declarar tipos de referencias mutables de solo lectura

Elemento Valor
RuleId CA2104
Category Microsoft.Security
Cambio importante Poco problemático

Nota

La regla CA2104 está obsoleta y se quitará en una versión futura de Visual Studio. No se implementará como analizador debido al análisis complicado necesario para determinar la inmutabilidad real de un tipo.

Causa

Un tipo visible externamente contiene un campo de sólo lectura visible externamente que es un tipo de referencia que se puede cambiar.

Nota

Esta regla está en desuso. Para más información, consulte Reglas en desuso.

Descripción de la regla

Un tipo que mutable es un tipo cuyos datos de instancia se pueden modificar. La clase System.Text.StringBuilder es un ejemplo de un tipo de referencia mutable. Contiene miembros que pueden cambiar el valor de una instancia de la clase. Un ejemplo de un tipo de referencia inmutable es la clase System.String. Una vez creada la instancia, su valor nunca puede cambiar.

El modificador de solo lectura (readonly en C#, ReadOnly en Visual Basic y const en C++) en un campo de tipo de referencia (o puntero en C++) impide que el campo se reemplace por una instancia diferente del tipo de referencia. Sin embargo, el modificador no impide que los datos de instancia del campo se modifiquen a través del tipo de referencia.

Esta regla puede mostrar accidentalmente una infracción de un tipo que, de hecho, es inmutable. En ese caso, es seguro suprimir la advertencia.

Los campos de matriz de solo lectura están exentos de esta regla, sino que provocan una infracción de CA2105: Los campos de matriz no deben ser de solo lectura.

Cómo corregir infracciones

Para corregir una infracción de esta regla, quite el modificador de solo lectura o, si un cambio importante es aceptable, reemplace el campo por un tipo inmutable.

Cuándo suprimir las advertencias

Es seguro suprimir una advertencia de esta regla si el tipo de campo es inmutable.

Ejemplo

En el ejemplo siguiente se muestra una declaración de campo que provoca una infracción de esta regla:

using System;
using System.Text;

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

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