CA2104: Não declarar tipos de referência mutáveis somente leitura
TypeName |
DoNotDeclareReadOnlyMutableReferenceTypes |
CheckId |
CA2104 |
<strong>Categoria</strong> |
Microsoft.Security |
Alteração significativa |
Não-separável |
Causa
Um tipo visível externamente contém um campo visível externamente de somente leitura que é um tipo de referência mutáveis.
Descrição da regra
Um tipo de mutável é um tipo de dados cujos instância podem ser modificados.O System.Text.StringBuilder classe é um exemplo de um tipo de referência mutáveis.Ele contém membros que podem alterar o valor de uma instância da classe.Um exemplo de um tipo de referência imutável é o System.String classe.Depois que tiver sido instanciado, seu valor nunca pode alterar.
O modificador de somente leitura (ReadOnly (referência de C#) em C#, ReadOnly (Visual Basic) na Visual Basic, e Const (C++) em C++) em uma referência (o ponteiro em C++) de campo de tipo impede o campo que está sendo substituído por uma instância diferente do tipo de referência.No entanto, o modificador não impede que os dados de instância do campo que está sendo modificado por meio do tipo de referência.
Campos de matriz de somente leitura são isentos desta regra, mas em vez disso, causar uma violação da CA2105: Campos de matriz não devem ser lidos apenas regra.
Como corrigir violações
Para corrigir uma violação desta regra, remover o modificador de somente leitura ou, se uma alteração significativa for aceitável, substitua o campo com um tipo imutável.
Quando suprimir avisos
É seguro eliminar um aviso esta regra se o tipo de campo é imutável.
Exemplo
O exemplo a seguir mostra uma declaração de campo que faz com que uma violação desta regra.
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()
{
}
};
}