Udostępnij za pośrednictwem


CA2104: Nie deklaruj zmiennych typów referencyjnych tylko do odczytu

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.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 String klasy.Po zostały utworzone, nigdy nie można zmienić jej wartość.

Modyfikator tylko do odczytu (readonly (odwołanie w C#) w C# ReadOnly (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: Pola tablicy nie powinny być tylko do odczytu 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()
        {
        }
    };
}