Поделиться через


CA2104: не объявляйте изменяемые ссылочные типы, доступные только для чтения

TypeName

DoNotDeclareReadOnlyMutableReferenceTypes

CheckId

CA2104

Категория

Microsoft.Security

Критическое изменение

Не критическое

Причина

Видимый извне тип содержит видимое извне и доступное только для чтение поле, являющееся изменяемым ссылочным типом.

Описание правила

Изменяемый тип — это тип, экземпляр которого может быть изменен.Примером изменяемого ссылочного типа может служить класс StringBuilder.Он содержит члены, которые могут изменять значение экземпляра класса.Примером неизменяемого ссылочного типа может служить класс String.После создания экземпляра его значение изменить нельзя.

Модификатор доступа только для чтения (readonly (Справочник по C#) в C#, ReadOnly (Visual Basic) в Visual Basic, и const (C++) в C++) по ссылке на поле типа (указателя в C++) препятствует замене поля на другой экземпляр типа ссылки.Тем не менее модификатор не запрещает, чтобы данные экземпляра этого поля изменялись посредством ссылочного типа.

Это правило не касается доступных только для чтения полей массива; они вызывают нарушение правила CA2105: поля массивов не должны быть доступны только для чтения.

Устранение нарушений

Чтобы устранить нарушение этого правила, удалите модификатор доступа только для чтения, или, если возможно критическое изменение, замените поле, используя неизменяемый тип.

Отключение предупреждений

Можно отключать предупреждения этого правила, если тип поля является неизменяемым.

Пример

В следующем примере показано объявление поля, нарушающее это правило.

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