CA2104: не объявляйте изменяемые ссылочные типы, доступные только для чтения
TypeName |
DoNotDeclareReadOnlyMutableReferenceTypes |
CheckId |
CA2104 |
Категория |
Microsoft.Security |
Критическое изменение |
Не критическое |
Причина
Видимый извне тип содержит видимое извне и доступное только для чтение поле, являющееся изменяемым ссылочным типом.
Описание правила
Изменяемый тип — это тип, экземпляр которого может быть изменен. Примером изменяемого ссылочного типа может служить класс System.Text.StringBuilder. Он содержит члены, которые могут изменять значение экземпляра класса. Примером неизменяемого ссылочного типа может служить класс System.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()
{
}
};
}