CA1010: Kolekcje powinny implementować interfejs generyczny
TypeName |
CollectionsShouldImplementGenericInterface |
CheckId |
CA1010 |
Kategoria |
Microsoft.Design |
Zmiana kluczowa |
Niekluczowa |
Przyczyna
Typ widoczny na zewnątrz implementuje interfejs IEnumerable, ale nie implementuje interfejsu IEnumerable i zawierającego cele zestawu Program .NET Framework 2,0.Ta reguła ignoruje typy implementujące IDictionary.
Opis reguły
Aby poszerzyć użyteczność kolekcji, zaimplementuj jeden z interfejsów kolekcji generycznej.Następnie można użyć kolekcji do wypełnienia kolekcji generycznych takich jak:
Jak naprawić naruszenia
Aby naprawić naruszenie tej zasady, należy zaimplementować jeden z następujących interfejsów kolekcji generycznej:
Kiedy pominąć ostrzeżenia
Bezpiecznie jest wyłączyć ostrzeżenia dotyczące tej zasady, jednak kolekcja będzie miała bardziej ograniczone zastosowanie.
Przykład naruszenia
Opis
Poniższy przykład pokazuje klasę (typ odwołania), która pochodzi z klasy niegenerycznej CollectionBase, która narusza reguły.
Kod
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);
}
}
}
Komentarze
Aby naprawić naruszenie tego naruszenia, należy implementować interfejsy generyczne lub zmienić klasę podstawową na typ, który już implementuje zarówno generyczne, jak i niegeneryczne interfejsy, takie jak klasy Collection<T>.
Naprawa przez zmianę klasy podstawowej
Opis
Poniższy przykład naprawia naruszenie przez zmianę klasy podstawowej kolekcji z niegenerycznej klasy CollectionBase, na klasę generyczną Collection<T> (Collection(Of T) w Visual Basic).
Kod
using System;
using System.Collections.ObjectModel;
namespace Samples
{
public class Book
{
public Book()
{
}
}
public class BookCollection : Collection<Book>
{
public BookCollection()
{
}
}
}
Komentarze
Zmiana klasy podstawowej już wydanej klasy jest uważana za kluczową zmianę dla istniejących konsumentów.
Naprawa przez implementację interfejsu
Opis
Poniższy przykład naprawia naruszenie przez implementowanie następujących interfejsów generycznych: IEnumerable<T>, ICollection<T> i IList<T> (IEnumerable(Of T), ICollection(Of T) i IList(Of T) w Visual Basic).
Kod
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()
{
}
}
}
}
Powiązane reguły
CA1005: Unikaj nadużywania parametrów na typach generycznych
CA1000: Nie deklaruj statycznych elementów członkowskich na typach generycznych
CA1002: Nie ujawniaj list generycznych
CA1006: Nie zagnieżdżaj typów generycznych w podpisach elementu członkowskiego
CA1004: Generyczne metody powinny dostarczyć parametry typu
CA1003: Użyj wystąpień obsługi zdarzeń generycznych
CA1007: Używaj danych generycznych wszędzie, gdzie jest to odpowiednie