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

Pozycja Wartość
Ruleid CA2104
Kategoria Microsoft.Security
Zmiana powodująca niezgodność Niezgodność

Uwaga

Reguła CA2104 jest przestarzała i zostanie usunięta w przyszłej wersji programu Visual Studio. Nie zostanie zaimplementowany jako analizator ze względu na skomplikowaną analizę wymaganą do określenia rzeczywistej niezmienności typu.

Przyczyna

Typ widoczny z zewnątrz zawiera widoczne na zewnątrz pole tylko do odczytu, które jest typu referencji zmiennej.

Uwaga

Ta reguła została przestarzała. Aby uzyskać więcej informacji, zobacz Przestarzałe reguły.

Opis reguły

Typ zmienny to typ, którego dane wystąpienia mogą być modyfikowane. Klasa System.Text.StringBuilder jest przykładem modyfikowalnego typu odwołania. Zawiera elementy członkowskie, które mogą zmienić wartość wystąpienia klasy. Przykładem niezmiennego typu odwołania jest System.String klasa . Po utworzeniu wystąpienia jej wartość nigdy nie może ulec zmianie.

Modyfikator tylko do odczytu (tylko do odczytu w języku C#, ReadOnly w języku Visual Basic i const w języku C++) w polu typu odwołania (lub wskaźnik w języku C++) uniemożliwia zastąpienie pola przez inne wystąpienie typu odwołania. Modyfikator nie uniemożliwia jednak modyfikacji danych wystąpienia pola za pomocą typu odwołania.

Ta reguła może przypadkowo pokazywać naruszenie typu, który jest w rzeczywistości niezmienny. W takim przypadku można bezpiecznie pominąć ostrzeżenie.

Pola tablic tylko do odczytu są wykluczone z tej reguły, ale zamiast tego powodują naruszenie ca2105: Pola tablicy nie powinny być regułą tylko do odczytu.

Jak naprawić naruszenia

Aby naprawić naruszenie tej reguły, usuń modyfikator tylko do odczytu lub, jeśli zmiana powodująca niezgodność jest akceptowalna, zastąp pole niezmiennym typem.

Kiedy pomijać ostrzeżenia

Można bezpiecznie pominąć ostrzeżenie z tej reguły, jeśli typ pola jest niezmienny.

Przykład

W poniższym przykładzie pokazano deklarację pola, która powoduje naruszenie tej reguły:

using System;
using System.Text;

namespace SecurityLibrary
{
    public class MutableReferenceTypes
    {
        static protected readonly StringBuilder SomeStringBuilder;

        static MutableReferenceTypes()
        {
            SomeStringBuilder = new StringBuilder();
        }
    }
}