Udostępnij za pośrednictwem


CA2104: Nie są deklarowane odczytu odniesienia tylko tych typów

TypeName

DoNotDeclareReadOnlyMutableReferenceTypes

CheckId

CA2104

Kategoria

Microsoft.Security

Złamanie zmiany

Bez podziału

Przyczyna

Typ widocznych zewnętrznie zawiera widoczne z zewnątrz pola tylko do odczytu, który jest typem odwołania i mutable.

Opis reguły

Typ mutable jest typu, którego dane wystąpienie, które mogą być modyfikowane.System.Text.StringBuilder Klasy jest przykładem typu mutable odniesienia.Zawiera elementy członkowskie, które można zmienić wartość instancji klasy.Na przykład typ odwołania niezmienne System.String klasy.Po zostały utworzone, nigdy nie można zmienić jej wartość.

Modyfikator tylko do odczytu (tylko do odczytu (C# odniesienia) w C# Tylko do odczytu (Visual Basic) w Visual Basic, i Const (C++) w języku C++) na odwołanie w polu Typ (wskaźnik w języku C++) zapobiega pole zastępowana przez różnych instancji typu odwołania.Jednakże modyfikator nie zapobiega danych instancji pola modyfikowane za pomocą typu odwołania.

Pola tylko do odczytu tablicy są zwolnione od tej reguły, ale zamiast powodować naruszenie CA2105: Pól tablicy nie są odczytywane tylko reguły.

Jak naprawić naruszenia

Aby naprawić naruszenie tej zasady, usuń modyfikator tylko do odczytu lub zmiana podziału jest dopuszczalna, Zastąp pole z typem niezmienne.

Kiedy do pomijania ostrzeżenia

Bezpiecznie wyłączyć ostrzeżenie od tej reguły, jeśli typem pola jest niezmienna.

Przykład

Poniższy przykład przedstawia deklaracji pola, która powoduje naruszenie tej zasady.

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