Compartir a través de


CA2104: No declarar tipos de referencias mutables de solo lectura

Nombre de tipo

DoNotDeclareReadOnlyMutableReferenceTypes

Identificador de comprobación

CA2104

Categoría

Microsoft.Security

Cambio problemático

Poco problemático

Motivo

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

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 creadas las instancias del tipo, su valor nunca puede cambiar.

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

Los campos de matriz de sólo lectura están exentos de esta regla pero en su lugar producen una infracción de la regla CA2105: Los campos de matrices no deberían ser de solo lectura.

Cómo corregir infracciones

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

Cuándo suprimir advertencias

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

Ejemplo

El ejemplo siguiente muestra una declaración de campo que infringe esta regla.

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