다음을 통해 공유


ICollection 구현에 강력한 형식의 멤버가 있습니다.

업데이트: 2007년 11월

TypeName

ICollectionImplementationsHaveStronglyTypedMembers

CheckId

CA1035

범주

Microsoft.Design

변경 수준

주요 변경

원인

public 또는 protected 형식이 System.Collections.ICollection을 구현하지만 ICollection.CopyTo에 강력한 형식의 메서드를 제공하지 않습니다. CopyTo의 강력한 형식 버전에서는 매개 변수 두 개를 받아들여야 하며 System.Array 또는 System.Object의 배열을 첫 번째 매개 변수로 사용할 수 없습니다.

규칙 설명

이 규칙에서는 인터페이스에서 제공하는 기능을 사용할 때 사용자가 인수를 Object 형식으로 캐스팅할 필요가 없도록 ICollection 구현에서 강력한 형식의 멤버를 제공할 것을 요구합니다. 이 규칙에서는 ICollection을 구현하는 형식이 이를 수행하여 Object보다 강력한 형식의 인스턴스 컬렉션을 관리한다고 가정합니다.

ICollectionSystem.Collections.IEnumerable 인터페이스를 구현합니다. 컬렉션의 개체가 System.ValueType을 확장할 경우 GetEnumerator에 대한 강력한 형식의 멤버를 제공하여 boxing으로 인한 성능 저하를 막아야 합니다. 컬렉션의 개체가 참조 형식인 경우에는 이렇게 할 필요가 없습니다.

인터페이스 멤버의 강력한 형식 버전을 구현하려면 CopyTo 같이 InterfaceName.InterfaceMemberName 형태의 이름을 사용하여 인터페이스 멤버를 명시적으로 구현합니다. 명시적인 인터페이스 멤버는 인터페이스에 선언된 데이터 형식을 사용합니다. CopyTo 같이 인터페이스 멤버 이름을 사용하여 강력한 형식의 멤버를 구현합니다. 강력한 형식의 멤버를 public으로 선언하고 매개 변수 및 반환 값을 컬렉션에서 관리되는 강력한 형식으로 선언합니다. 인터페이스에 선언된 ObjectArray 등의 더 약한 형식이 강력한 형식으로 바뀝니다.

위반 문제를 해결하는 방법

이 규칙 위반 문제를 해결하려면 인터페이스 멤버를 CopyTo로 선언하여 명시적으로 구현합니다. CopyTo로 선언된 강력한 형식의 public 멤버를 추가하고 강력한 형식의 배열을 첫 번째 매개 변수로 사용하도록 합니다.

경고를 표시하지 않는 경우

이진 트리 같이 새 컬렉션을 확장하는 형식이 강력한 형식을 결정하는 새로운 개체 기반 컬렉션을 구현할 경우에는 이 규칙에서 경고를 표시하지 않습니다. 이러한 형식은 이 규칙을 따라야 하며 강력한 형식의 멤버를 노출해야 합니다.

예제

다음 예제에서는 ICollection을 구현하는 올바른 방법을 보여 줍니다.

using System;
using System.Collections;
namespace DesignLibrary
{

   public class ExceptionCollection : ICollection
   {   
      private ArrayList data;

      ExceptionCollection()
      {
         data = new ArrayList();
      }

      // Provide the explicit interface member for ICollection.
      void ICollection.CopyTo(Array array, int index)
      {
         data.CopyTo(array, index);
      }

      // Provide the strongly typed member for ICollection.
      public void CopyTo(Exception[] array, int index)
      {
         ((ICollection)this).CopyTo(array, index);
      }

      // Implement the rest of the ICollection members.
      public int Count
      {
        get 
        {
           return data.Count;
        }
      }

      public object SyncRoot
      {
         get 
        {
           return this; 
        }
      }

      public bool IsSynchronized
      {
         get 
         {
            return false; 
         }
      }

      // The IEnumerable interface is implemented by ICollection.
      // Because the type underlying this collection is a reference type,
      // you do not need a strongly typed version of GetEnumerator.

      public IEnumerator GetEnumerator()
      {
         return data.GetEnumerator();
      }
   }
}

관련 규칙

열거자는 강력한 형식이어야 합니다.

목록은 강력한 형식이어야 합니다.

참고 항목

참조

System.Array

System.Collections.IEnumerable

System.Collections.ICollection

System.Object