Bagikan melalui


CA1010: Pengumpulan harus menerapkan antarmuka generik

Properti Nilai
ID Aturan CA1010
Judul Koleksi harus menerapkan antarmuka generik
Golongan Desain
Perbaikan bersifat disruptif atau non-disruptif Non-disruptif
Diaktifkan secara default di .NET 8 Tidak

Penyebab

Jenis mengimplementasikan System.Collections.IEnumerable antarmuka tetapi tidak mengimplementasikan System.Collections.Generic.IEnumerable<T> antarmuka, dan rakitan yang berisi menargetkan .NET. Aturan ini mengabaikan jenis yang mengimplementasikan System.Collections.IDictionary.

Secara default, aturan ini hanya melihat jenis yang terlihat secara eksternal, tetapi ini dapat dikonfigurasi. Anda juga dapat mengonfigurasi antarmuka tambahan untuk mengharuskan antarmuka generik diimplementasikan.

Deskripsi aturan

Untuk memperluas kegunaan kumpulan, terapkan salah satu antarmuka kumpulan generik. Kemudian koleksi dapat digunakan untuk mengisi jenis koleksi generik seperti berikut:

Cara memperbaiki pelanggaran

Untuk memperbaiki pelanggaran aturan ini, terapkan salah satu antarmuka pengumpulan generik berikut:

Kapan harus menekan peringatan

Aman untuk menekan peringatan dari aturan ini; namun, penggunaan koleksi akan lebih terbatas.

Menyembunyikan peringatan

Jika Anda hanya ingin menyembunyikan satu pelanggaran, tambahkan arahan praprosedur ke file sumber Anda untuk dinonaktifkan lalu aktifkan kembali aturannya.

#pragma warning disable CA1010
// The code that's violating the rule is on this line.
#pragma warning restore CA1010

Untuk menonaktifkan aturan untuk file, folder, atau proyek, atur tingkat keparahannya ke none dalam file konfigurasi.

[*.{cs,vb}]
dotnet_diagnostic.CA1010.severity = none

Untuk informasi selengkapnya, lihat Cara menyembunyikan peringatan analisis kode.

Mengonfigurasi kode yang akan dianalisis

Gunakan opsi berikut untuk mengonfigurasi bagian mana dari codebase Anda yang akan menjalankan aturan ini.

Anda dapat mengonfigurasi opsi ini hanya untuk aturan ini, untuk semua aturan yang berlaku untuknya, atau untuk semua aturan dalam kategori ini (Desain) yang berlaku untuknya. Untuk informasi selengkapnya, lihat Opsi konfigurasi aturan kualitas kode.

Menyertakan permukaan API tertentu

Anda dapat mengonfigurasi bagian mana dari basis kode yang akan menjalankan aturan ini, berdasarkan aksesibilitasnya. Misalnya, untuk menentukan bahwa aturan hanya boleh dijalankan pada permukaan API non-publik, tambahkan pasangan kunci-nilai berikut ke file .editorconfig di proyek Anda:

dotnet_code_quality.CAXXXX.api_surface = private, internal

Antarmuka generik tambahan yang diperlukan

Anda dapat mengonfigurasi daftar nama antarmuka (dipisahkan oleh |) dengan antarmuka generik yang sepenuhnya memenuhi syarat yang diperlukan (dipisahkan oleh ->).

Format antarmuka yang diizinkan:

  • Nama antarmuka saja (mencakup semua antarmuka dengan nama, terlepas dari jenis atau namespace yang berisi).
  • Nama yang sepenuhnya memenuhi syarat dalam format ID dokumentasi simbol dengan awalan opsionalT:.

Contoh:

Nilai opsi Ringkasan
dotnet_code_quality.CA1010.additional_required_generic_interfaces = ISomething->System.Collections.Generic.IEnumerable`1 Semua jenis yang diterapkan ISomething terlepas dari namespace layanannya diharapkan juga System.Collections.Generic.IEnumerable<T>menerapkan .
dotnet_code_quality.CA1010.additional_required_generic_interfaces = T:System.Collections.IDictionary->T:System.Collections.Generic.IDictionary`2 Semua jenis yang mengimplementasikan System.Collections.IDictionary diharapkan juga akan menerapkan System.Collections.Generic.IDictionary<TKey,TValue>.

Contoh

Contoh berikut menunjukkan kelas yang berasal dari kelas non-generik CollectionBase dan melanggar aturan ini.

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

Untuk memperbaiki pelanggaran aturan ini, lakukan salah satu hal berikut ini:

  • Terapkan antarmuka generik.
  • Ubah kelas dasar menjadi jenis yang sudah mengimplementasikan antarmuka generik dan non-generik, seperti Collection<T> kelas .

Perbaikan berdasarkan implementasi antarmuka

Contoh berikut memperbaiki pelanggaran dengan menerapkan antarmuka generik ini: IEnumerable<T>, , ICollection<T>dan IList<T>.

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 => (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()
        {
        }
    }
}

Memperbaiki berdasarkan perubahan kelas dasar

Contoh berikut memperbaiki pelanggaran dengan mengubah kelas dasar koleksi dari kelas non-generik CollectionBase ke kelas generik Collection<T> (Collection(Of T) di Visual Basic).

public class Book
{
    public Book()
    {
    }
}

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

Mengubah kelas dasar kelas yang sudah dirilis dianggap sebagai perubahan yang melanggar bagi konsumen yang ada.

Baca juga