Aracılığıyla paylaş


CA1010: Koleksiyonlar genel arabirim uygulamalıdır

TypeName

CollectionsShouldImplementGenericInterface

CheckId

CA1010

Kategori

Microsoft.Design

Değişiklik kesiliyor

Bölünemez

Neden

Dışarıdan görünen bir tür uygulayan IEnumerable arabirim ancak uygulamaz IEnumerable arabirimi ve içeren derleme hedefleri .NET Framework 2,0.Bu kuralı uygulamak türleri yok sayar IDictionary.

Kural Tanımı

Koleksiyonunun kullanılabilirliğini genişletmek için genel koleksiyonu arabirimleri birini uygulamak.Daha sonra toplama aşağıdaki gibi genel koleksiyon türleri doldurmak için kullanılabilir:

İhlalleri düzeltmek nasıl

Bu kuralı ihlal düzeltmek için aşağıdaki genel koleksiyonu arabirimlerden birini uygulayın:

Uyarıları ne zaman

Uyarı Bu kuraldan bastırmak güvenlidir; Ancak, koleksiyon daha sınırlı kullanıma sahip olur.

Örnek ihlali

Description

Genel olmayan türeyen bir sınıfı (başvuru türü) aşağıdaki örnekte gösterildiği CollectionBase bu kuralını ihlal eden sınıf.

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);
        }
    }
}

Comments

Bu ihlali ihlalinden düzeltmek için genel arabirimleri uygulayan ya zaten hem genel hem genel olmayan arabirimleri gibi uygulayan bir tür temel sınıf değiştirmek Collection<T> sınıfı.

Temel sınıf değişikliği düzeltme

Description

Aşağıdaki örnek ihlali olmayan-genel topluluğunun temel sınıf değiştirerek giderir CollectionBase genel sınıfa Collection<T> (Collection(Of T) , Visual Basic) sınıfı.

Kod

using System;
using System.Collections.ObjectModel; 

namespace Samples
{    
    public class Book        
    {               
        public Book()                
        {                
        }        
    }    

    public class BookCollection : Collection<Book>    
    {        
        public BookCollection()        
        {        
        }    
    }
}

Comments

Zaten yayımlanmış bir sınıfının temel sınıfı varolan Tüketiciler için son değişiklik kabul edilir.

Arabirim uygulaması tarafından düzeltme

Description

The following example fixes the violation by implementing these generic interfaces: IEnumerable<T>, ICollection<T>, and IList<T> (IEnumerable(Of T), ICollection(Of T), and IList(Of T) in 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()
            {
            }
        }
    }
}

İlgili kuralları

CA1005: Genel türlerde aşırı parametrelerden kaçının

CA1000: Genel türlerde statik üyeleri belirtme

CA1002: Genel listeleri gösterme

CA1006: Üye imzalarında genel türleri iç içe kullanmayın

CA1004: Genel yöntemler tür parametresi sağlamalıdır

CA1003: Genel olay işleyici örnekleri kullan

CA1007: Uygun yerlerde genel türler kullanın

Ayrıca bkz.

Başvuru

Genel Türler (C# Programlama Kılavuzu)