Hari ini saya terkejut menemukan itu di C # yang bisa saya lakukan:
List<int> a = new List<int> { 1, 2, 3 };
Mengapa saya bisa melakukan ini? Konstruktor apa yang disebut? Bagaimana saya bisa melakukan ini dengan kelas saya sendiri? Saya tahu bahwa ini adalah cara untuk menginisialisasi array tetapi array adalah item bahasa dan Daftar adalah objek sederhana ...
c#
.net
list
initialization
Ignacio Soler Garcia
sumber
sumber
{ { "key1", "value1"}, { "key2", "value2"} }
List<int>
sebenarnya array saja. Saya benci tim C # karena mereka tidak menyebutkan namaArrayList<T>
yang terdengar begitu jelas dan alami.Jawaban:
Ini adalah bagian dari sintaks initializer koleksi di .NET. Anda dapat menggunakan sintaks ini pada koleksi yang Anda buat selama:
Ini mengimplementasikan
IEnumerable
(lebih disukaiIEnumerable<T>
)Itu memiliki metode bernama
Add(...)
Apa yang terjadi adalah konstruktor default dipanggil, dan kemudian
Add(...)
dipanggil untuk setiap anggota penginisialisasi.Dengan demikian, kedua blok ini kira-kira identik:
Dan
Anda dapat memanggil konstruktor alternatif jika Anda mau, misalnya untuk mencegah ukuran yang terlalu besar
List<T>
selama pertumbuhan, dll:Perhatikan bahwa
Add()
metode ini tidak perlu mengambil satu item, misalnyaAdd()
metode untukDictionary<TKey, TValue>
mengambil dua item:Secara kasar identik dengan:
Jadi, untuk menambahkan ini ke kelas Anda sendiri, yang perlu Anda lakukan, seperti yang disebutkan, adalah mengimplementasikan
IEnumerable
(sekali lagi, lebih disukaiIEnumerable<T>
) dan membuat satu atau lebihAdd()
metode:Kemudian Anda dapat menggunakannya seperti koleksi BCL lakukan:
(Untuk informasi lebih lanjut, lihat MSDN )
sumber
List<int> temp = new List<int>(); temp.Add(1); ... List<int> a = temp;
Yaitu,a
variabel tidak diinisialisasi sampai setelah semua add dipanggil. Kalau tidak, itu legal untuk melakukan sesuatuList<int> a = new List<int>() { a.Count, a.Count, a.Count };
yang gila untuk dilakukan.List<int> a; a = new List<int>() { a.Count };
danList<int> a = new List<int>() { a.Count };
T x = y;
sama denganT x; x = y;
, Fakta ini dapat menyebabkan beberapa situasi aneh. Misalnya,int x = M(out x) + x;
sangat legal karenaint x; x = M(out x) + x;
legal.IEnumerable<T>
; non-generikIEnumerable
sudah cukup untuk memungkinkan penggunaan sintaks initializer koleksi.using (var x = new Something{ 1, 2 })
tidak akan membuang objek jika salah satuAdd
panggilan gagal.Ini disebut gula sintaksis .
List<T>
adalah kelas "sederhana", tetapi kompiler memberikan perlakuan khusus untuknya agar hidup Anda lebih mudah.Yang ini disebut initializer koleksi . Anda perlu menerapkan
IEnumerable<T>
danAdd
metode.sumber
Menurut Spesifikasi C # Versi 3.0 "Objek koleksi yang digunakan penginisialisasi koleksi harus dari tipe yang mengimplementasikan System.Collections.Generic.ICollection untuk tepat satu T."
Namun, informasi ini tampaknya tidak akurat pada tulisan ini; lihat klarifikasi Eric Lippert dalam komentar di bawah.
sumber
Ini berfungsi berkat inisialisasi koleksi yang pada dasarnya memerlukan koleksi untuk menerapkan metode Tambahkan dan itu akan bekerja untuk Anda.
sumber
Hal keren lainnya tentang inisialisasi koleksi adalah Anda dapat memiliki banyak kelebihan
Add
metode dan Anda dapat memanggil mereka semua di inisialisasi yang sama! Misalnya ini berfungsi:Itu memanggil kelebihan yang benar. Juga, hanya mencari metode dengan nama
Add
, tipe pengembalian bisa apa saja.sumber
Array seperti sintaks sedang diubah dalam serangkaian
Add()
panggilan.Untuk melihat ini dalam contoh yang jauh lebih menarik, pertimbangkan kode berikut di mana saya melakukan dua hal menarik yang terdengar ilegal pertama di C #, 1) mengatur properti readonly, 2) mengatur daftar dengan array seperti inisialisasi.
Kode ini akan bekerja dengan sempurna, walaupun 1) MyList hanya bisa dibaca dan 2) Saya menetapkan daftar dengan penginisialisasi array.
Alasan mengapa ini bekerja, adalah karena dalam kode yang merupakan bagian dari objek intializer kompiler selalu mengubah
{}
sintaksis seperti ke serangkaianAdd()
panggilan yang sangat legal bahkan pada bidang yang hanya dibaca.sumber