컬렉션 속성은 읽기 전용이어야 합니다.
업데이트: 2007년 11월
TypeName |
CollectionPropertiesShouldBeReadOnly |
CheckId |
CA2227 |
범주 |
Microsoft.Usage |
변경 수준 |
주요 변경 |
원인
외부에서 볼 수 있는 쓰기 가능한 속성이 System.Collections.ICollection을 구현하는 형식입니다. 배열, 인덱서(이름이 'Item'인 속성) 및 권한 집합은 이 규칙에서 무시됩니다.
규칙 설명
쓰기 가능한 컬렉션 속성으로 사용자는 컬렉션을 전혀 다른 컬렉션으로 바꿀 수 있습니다. 읽기 전용 속성은 컬렉션을 바꾸지 못하도록 하지만 개별 멤버를 설정하는 것은 여전히 가능합니다. 컬렉션을 바꾸려는 경우에 많이 사용하는 디자인 패턴은 컬렉션에서 모든 요소를 제거하는 메서드와 컬렉션을 다시 채우는 메서드를 포함시키는 것입니다. 이 패턴의 예제를 보려면 System.Collections.ArrayList 클래스의 Clear 및 AddRange 메서드를 참조하십시오.
이진 및 XML serialization에서는 컬렉션인 읽기 전용 속성을 지원합니다. System.Xml.Serialization.XmlSerializer 클래스에는 ICollection 및 System.Collections.IEnumerable을 구현하는 형식이 serialize가 가능하도록 하기 위한 특정 요구 사항이 있습니다.
위반 문제를 해결하는 방법
이 규칙 위반 문제를 해결하려면 속성을 읽기 전용으로 만들고 디자인에 필요한 경우 컬렉션을 지우고 다시 채우는 메서드를 추가합니다.
경고를 표시하지 않는 경우
이 규칙에서는 경고를 표시해야 합니다.
예제
다음 예제에서는 쓰기 가능한 컬렉션 속성이 있는 형식을 보여 주고 컬렉션을 직접 바꾸는 방법을 보여 줍니다. 또한 Clear 및 AddRange 메서드를 사용하여 읽기 전용 컬렉션 속성을 바꾸는 방법도 보여 줍니다.
Imports System
Imports System.Collections
Namespace UsageLibrary
Public Class WritableCollection
Dim strings As ArrayList
Property SomeStrings As ArrayList
Get
Return strings
End Get
' Violates the rule.
Set
strings = Value
End Set
End Property
Sub New()
strings = New ArrayList( _
New String() {"IEnumerable", "ICollection", "IList"} )
End Sub
End Class
Class ViolatingVersusPreferred
Shared Sub Main()
Dim newCollection As New ArrayList( _
New String() {"a", "new", "collection"} )
' strings is directly replaced with newCollection.
Dim collection As New WritableCollection()
collection.SomeStrings = newCollection
' newCollection is added to the cleared strings collection.
collection.SomeStrings.Clear()
collection.SomeStrings.AddRange(newCollection)
End Sub
End Class
End Namespace
using System;
using System.Collections;
namespace UsageLibrary
{
public class WritableCollection
{
ArrayList strings;
public ArrayList SomeStrings
{
get { return strings; }
// Violates the rule.
set { strings = value; }
}
public WritableCollection()
{
strings = new ArrayList(
new string[] {"IEnumerable", "ICollection", "IList"} );
}
}
class ReplaceWritableCollection
{
static void Main()
{
ArrayList newCollection = new ArrayList(
new string[] {"a", "new", "collection"} );
// strings is directly replaced with newCollection.
WritableCollection collection = new WritableCollection();
collection.SomeStrings = newCollection;
// newCollection is added to the cleared strings collection.
collection.SomeStrings.Clear();
collection.SomeStrings.AddRange(newCollection);
}
}
}
using namespace System;
using namespace System::Collections;
namespace UsageLibrary
{
public ref class WritableCollection
{
public:
// Violates the rule.
property ArrayList^ SomeStrings;
WritableCollection()
{
SomeStrings = gcnew ArrayList(
gcnew array<String^> {"IEnumerable", "ICollection", "IList"} );
}
};
}
using namespace UsageLibrary;
void main()
{
ArrayList^ newCollection = gcnew ArrayList(
gcnew array<String^> {"a", "new", "collection"} );
// strings is directly replaced with newCollection.
WritableCollection^ collection = gcnew WritableCollection();
collection->SomeStrings = newCollection;
// newCollection is added to the cleared strings collection.
collection->SomeStrings->Clear();
collection->SomeStrings->AddRange(newCollection);
}