Compartilhar via


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