CA2104: 변경 가능한 읽기 전용 참조 형식을 선언하지 마십시오.
TypeName |
DoNotDeclareReadOnlyMutableReferenceTypes |
CheckId |
CA2104 |
범주 |
Microsoft.Security |
변경 수준 |
주요 변경 아님 |
원인
외부에서 볼 수 있는 형식에 변경 가능한 참조 형식인, 외부에서 볼 수 있는 읽기 전용 필드가 포함되었습니다.
규칙 설명
변경 가능한 형식은 해당 인스턴스 데이터를 수정할 수 있는 형식을 말합니다. 변경 가능한 참조 형식으로는 System.Text.StringBuilder 클래스를 예로 들 수 있습니다. 여기에는 클래스의 인스턴스 값을 변경할 수 있는 멤버가 들어 있습니다. 변경할 수 없는 참조 형식으로는 System.String 클래스를 예로 들 수 있습니다. 이 참조 형식이 인스턴스화된 이후에는 해당 값을 변경할 수 없습니다.
참조 형식 필드(C++에서는 포인터)에 대한 읽기 전용 한정자(C#에서는 readonly(C# 참조), Visual Basic에서는 ReadOnly(Visual Basic), C++에서는 const (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()
{
}
};
}