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 9 | No |
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:
- System.Collections.Generic.List<T>
- System.Collections.Generic.Queue<T>
- System.Collections.Generic.Stack<T>
Cara memperbaiki pelanggaran
Untuk memperbaiki pelanggaran aturan ini, terapkan salah satu antarmuka pengumpulan generik berikut:
- System.Collections.Generic.IEnumerable<T>
- System.Collections.Generic.ICollection<T>
- System.Collections.Generic.IList<T>
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, atau untuk semua aturan dalam kategori ini (Desain) yang diterapkannya. Untuk informasi selengkapnya, lihat Opsi konfigurasi aturan kualitas kode.
Menyertakan permukaan API tertentu
Anda dapat mengonfigurasi bagian basis kode mana yang akan dijalankan aturan ini, berdasarkan aksesibilitasnya, dengan mengatur opsi api_surface. 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
Nota
Ganti bagian XXXX
CAXXXX
dengan ID aturan yang berlaku.
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 opsional
T:
.
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.
Aturan terkait
- CA1005: Menghindari parameter yang berlebihan pada jenis generik
- CA1000: Jangan deklarasikan anggota statis pada jenis generik
- CA1002: Jangan mengekspos daftar generik
- CA1003: Menggunakan instans penanganan aktivitas generik