다음을 통해 공유


컬렉션 속성은 읽기 전용이어야 합니다.

업데이트: 2007년 11월

TypeName

CollectionPropertiesShouldBeReadOnly

CheckId

CA2227

범주

Microsoft.Usage

변경 수준

주요 변경

원인

외부에서 볼 수 있는 쓰기 가능한 속성이 System.Collections.ICollection을 구현하는 형식입니다. 배열, 인덱서(이름이 'Item'인 속성) 및 권한 집합은 이 규칙에서 무시됩니다.

규칙 설명

쓰기 가능한 컬렉션 속성으로 사용자는 컬렉션을 전혀 다른 컬렉션으로 바꿀 수 있습니다. 읽기 전용 속성은 컬렉션을 바꾸지 못하도록 하지만 개별 멤버를 설정하는 것은 여전히 가능합니다. 컬렉션을 바꾸려는 경우에 많이 사용하는 디자인 패턴은 컬렉션에서 모든 요소를 제거하는 메서드와 컬렉션을 다시 채우는 메서드를 포함시키는 것입니다. 이 패턴의 예제를 보려면 System.Collections.ArrayList 클래스의 ClearAddRange 메서드를 참조하십시오.

이진 및 XML serialization에서는 컬렉션인 읽기 전용 속성을 지원합니다. System.Xml.Serialization.XmlSerializer 클래스에는 ICollectionSystem.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);
}

관련 규칙

속성은 배열을 반환해서는 안 됩니다.