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