Compartir a través de


No declarar tipos de referencias mutables de sólo lectura

Actualización: noviembre 2007

Nombre de tipo

DoNotDeclareReadOnlyMutableReferenceTypes

Identificador de comprobación

CA2104

Categoría

Microsoft.Security

Cambio problemático

No 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 sólo lectura (readonly (Referencia de C#) en C#, ReadOnly (Visual Basic) en Visual Basic y const (C++) en C++) de un campo de tipo de referencia (puntero en C++) evita que el campo sea reemplazado por una instancia diferente al tipo de referencia pero no evita que este tipo modifique los datos de instancia del campo.

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 Los campos de matrices no deberían ser de sólo 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()
        {
        }
    };
}