CA1010: 컬렉션은 제네릭 인터페이스를 구현해야 합니다.
TypeName |
CollectionsShouldImplementGenericInterface |
CheckId |
CA1010 |
범주 |
Microsoft.Design |
변경 수준 |
주요 변경 아님 |
원인
외부에 노출되는 형식이 System.Collections.IEnumerable 인터페이스는 구현하지만 System.Collections.Generic.IEnumerable<T> 인터페이스는 구현하지 않으며, 포함하는 어셈블리가 .NET Framework 2.0을 대상으로 합니다. 이 규칙은 System.Collections.IDictionary를 구현하는 형식을 무시합니다.
규칙 설명
컬렉션의 유용성을 높이려면 제네릭 컬렉션 인터페이스 중 하나를 구현합니다. 그러면 컬렉션을 사용하여 다음과 같은 제네릭 컬렉션 형식을 채울 수 있습니다.
위반 문제를 해결하는 방법
이 규칙 위반 문제를 해결하려면 다음 제네릭 컬렉션 인터페이스 중 하나를 구현합니다.
경고를 표시하지 않는 경우
이 규칙에서 경고를 표시하지 않도록 설정해도 안전하지만 이렇게 하면 컬렉션의 용도가 더 제한됩니다.
규칙 위반 예
설명
다음 예제에서는 제네릭이 아닌 CollectionBase 클래스에서 파생되며 이 규칙을 위반하는 클래스(참조 형식)를 보여 줍니다.
코드
using System;
using System.Collections;
namespace Samples
{
public class Book
{
public Book()
{
}
}
public class BookCollection : CollectionBase
{
public BookCollection()
{
}
public void Add(Book value)
{
InnerList.Add(value);
}
public void Remove(Book value)
{
InnerList.Remove(value);
}
public void Insert(int index, Book value)
{
InnerList.Insert(index, value);
}
public Book this[int index]
{
get { return (Book)InnerList[index]; }
set { InnerList[index] = value; }
}
public bool Contains(Book value)
{
return InnerList.Contains(value);
}
public int IndexOf(Book value)
{
return InnerList.IndexOf(value);
}
public void CopyTo(Book[] array, int arrayIndex)
{
InnerList.CopyTo(array, arrayIndex);
}
}
}
주석
이 규칙 위반 문제를 해결하려면 제네릭 인터페이스를 구현하거나 Collection<T> 클래스와 같이 제네릭 인터페이스와 제네릭이 아닌 인터페이스를 이미 모두 구현하는 형식으로 기본 형식을 변경해야 합니다.
기본 형식 변경을 통한 해결 방법
설명
다음 예제에서는 컬렉션의 기본 형식을 제네릭이 아닌 CollectionBase 클래스에서 제네릭 Collection<T>(Visual Basic의 경우 Collection(Of T)) 클래스로 변경하여 위반 문제를 해결합니다.
코드
using System;
using System.Collections.ObjectModel;
namespace Samples
{
public class Book
{
public Book()
{
}
}
public class BookCollection : Collection<Book>
{
public BookCollection()
{
}
}
}
주석
이미 발표된 클래스의 기본 클래스를 변경하는 것은 기존 소비자에게 주요 변경 사항으로 간주됩니다.
인터페이스 구현을 통한 해결 방법
설명
다음 예제에서는 제네릭 클래스 IEnumerable<T>, ICollection<T> 및 IList<T>(Visual Basic의 경우 IEnumerable(Of T), ICollection(Of T) 및 IList(Of T))를 구현하여 규칙 위반 문제를 해결합니다.
코드
using System;
using System.Collections;
using System.Collections.Generic;
namespace Samples
{
public class Book
{
public Book()
{
}
}
public class BookCollection : CollectionBase, IList<Book>
{
public BookCollection()
{
}
int IList<Book>.IndexOf(Book item)
{
return this.List.IndexOf(item);
}
void IList<Book>.Insert(int location, Book item)
{
}
Book IList<Book>.this[int index]
{
get { return (Book) this.List[index]; }
set { }
}
void ICollection<Book>.Add(Book item)
{
}
bool ICollection<Book>.Contains(Book item)
{
return true;
}
void ICollection<Book>.CopyTo(Book[] array, int arrayIndex)
{
}
bool ICollection<Book>.IsReadOnly
{
get { return false; }
}
bool ICollection<Book>.Remove(Book item)
{
if (InnerList.Contains(item))
{
InnerList.Remove(item);
return true;
}
return false;
}
IEnumerator<Book> IEnumerable<Book>.GetEnumerator()
{
return new BookCollectionEnumerator(InnerList.GetEnumerator());
}
private class BookCollectionEnumerator : IEnumerator<Book>
{
private IEnumerator _Enumerator;
public BookCollectionEnumerator(IEnumerator enumerator)
{
_Enumerator = enumerator;
}
public Book Current
{
get { return (Book)_Enumerator.Current; }
}
object IEnumerator.Current
{
get { return _Enumerator.Current; }
}
public bool MoveNext()
{
return _Enumerator.MoveNext();
}
public void Reset()
{
_Enumerator.Reset();
}
public void Dispose()
{
}
}
}
}
관련 규칙
CA1005: 제네릭 형식에 매개 변수를 너무 많이 사용하지 마십시오.
CA1000: 정적 멤버를 제네릭 형식으로 선언하지 마십시오.
CA1006: 멤버 시그니처에 제네릭 형식을 중첩하지 마십시오.
CA1004: 제네릭 메서드는 형식 매개 변수를 제공해야 합니다.
CA1003: 제네릭 이벤트 처리기 인스턴스를 사용하십시오.