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