C # 6: Koleksi initializers

titik

Model dan koleksi initializer

Beberapa C # keren adalah model berbasis dan tidak -tip berbasis seperti yang Anda harapkan bisa. Sebagai contoh, foreach tidak perlu untuk mengimplementasikan jenis pendaftaran IEnumerable untuk bekerja, itu hanya diperlukan untuk memiliki memiliki GetEnumerator () metode. Tempat lain yang datang untuk merancang model berbasis terjadi juga untuk menggambarkan bagaimana berguna pendekatan ini model berbasis kaleng, adalah koleksi initializers sebagai berikut:

 Daftar var = new Daftar & amp; amp; lt; int & amp; amp; gt; {1, 2, 3, 4, 5, 6}; 

Jika dikompilasi untuk setiap nilai di inisialisasi dari C # compiler 1 terlihat untuk Add () jenis metode koleksi dengan angka yang sesuai argumen untuk spesies yang sesuai, yang kemudian memanggil untuk jumlah ini. Keuntungan menggunakan pendekatan berbasis model yang compiler tidak perlu melacak semua jenis kemungkinan yang kompatibel atau apa tahu tambahkan () dapat mendukung metode. Ini hanya berlaku seperti itu timbul dari IEnumerable , dan memiliki Add () metode yang cocok dengan nilai-nilai inisialisasi. Hal ini memungkinkan kita untuk jenis pertemuan. Berbagai cara yang berbeda untuk menambah nilai, dapat mendukung tanpa mengetahui compiler spesies kita pernah ada, misalnya, kita dapat membuat koleksi nama dengan Add () metode untuk mendapatkan satu atau dua string dan kemudian menginisialisasi elemen atau hanya nama atau nama pertama dan terakhir 2 .

 nama var = koleksi baru Nama {"Jones", {'David', "Smith"}, {"Daniel", "Smith"}, "Smith"} ; 

initializers Koleksi di C # 6

Dalam C # 6, inisialisasi sintaks array baru ditambahkan dan cara compiler mempunyai kinerja sintaks yang ada berubah. Sebelum kita sampai ke sintaks baru ditambahkan, mari kita lihat bagaimana kombinasi dari sintaks saat ini telah berubah penampilan. Untuk melakukan ini, Anda harus memiliki koleksi datetimeoffset nilai-nilai, di mana kita memfasilitasi tanggal dan waktu nilai string parsable harus. Untuk mendukung hal ini, kita bisa menerapkan cara baru dengan panggilan masing-masing atau kita dapat dari jenis koleksi yang ada Daftar & amp; amp; masalah lt; Datetimeoffset & amp; amp; gt; dan menetapkan baru Add () String dukungan

 Daftar public class datetimeoffset:. Daftar & amp; amp; lt; Datetimeoffset & amp; amp; gt; {Public void add (nilai String) {base.Add (DateTimeOffset.Parse (nilai)); }} 

Tentu saja, tidak semua koleksi untuk memperluas dan menciptakan spesies baru terbuka untuk rumit, karena kita ingin, kita ingin memulai hanya secara acak dari daftar datetimeoffset , yang berbeda. Untuk mendaftar jenis dan kebutuhan untuk mendapatkan jenis dilaksanakan pembungkus atau derivasi, metode ekspansi VB.NET Tambahkan memperluas () Pilihan didukung dengan cara. Saya suka ide itu karena, pada contoh sebelumnya, daftar benar-benar masih datetimeoffset dan kami ingin melihat orang lain sehingga kita hanya dapat untuk mendukung String nilai-nilai; mengapa kita dipaksa untuk menggunakan jenis yang berbeda untuk ini? Sayangnya ((voice gaya Cue Top Gear)), fitur ini tidak termasuk dalam C # ... sejauh ini. Sejak C # 6 ada perbedaan antara VB.NET dan C #; compiler untuk mencocokkan Add () metode ekstensi bukannya sesuai Add () metode jenis itu sendiri.

 Extensions public class {Data public static void statis (ini daftar & amp; amp; lt; datetimeoffset & amp; amp; gt; String value daftar) {list.add ( DateTimeOffset.Parse (nilai)); }} 

metode menarik, perubahan ini, seperti C # memecahkan lebih spesifik kelebihan beban itu hanya mendukung Add () metode penyuluhan dan tidak metode dalam ekstensi skenario lain model- dasar seperti GetEnumerator . Saya tidak yakin mengapa demikian, karena saya membayangkan beberapa kasus di mana sejumlah non-terdaftar dari spesies yang ada, bisa sangat indah 3 , tapi saya berharap itu karena tidak jelas apa yang akan dihitung dan akan kode tidak jelas dan sulit untuk 4 mengikuti rf4-3210. Add () Gunakan metode dalam inisialisasi tidak memiliki ketidakpastian ini, sebagai compiler membuat jelas bahwa ada berhasil ditemukan cocok menambahkan metode yang baik pertemuan jenis dan tipe menambahkan pencocokan elemen .


Indeks initializer

initializers koleksi lain berubah di C # 6 adalah pengenalan sintaks indeks intializer. Sintaks baru ini mirip dengan pertemuan sintaks initializer ada kita bahas, kecuali bahwa alih-alih menggunakan Add () metode, Indexers menggunakannya. Dengan berbasis indeks koleksi inisialisasi kita dapat menentukan nilai indeks tertentu dalam koleksi. Ini bekerja untuk semua pengindeks yang mengimplementasikan koleksi. String, String & amp; amp; gt ;; tradisional, kita bisa menggunakan Kamus & amp; amp; lt peluncuran dengan Add () metode saham seperti ini:

 pasangan var = new Kamus & amp; amp; lt; string, string & amp; amp; gt; {{"Alamat", "12 cara ini, di mana saja"}, {"nama", "Foo Bob"}, {"title", "Master of the Universe"}}; 

Namun, inisialisasi indeks sintaks, kita dapat membuat jelas bahwa indikasi berbagai lainnya, sehingga jauh lebih mudah dibaca dari:

 Pasangan var = new Kamus & amp; amp; lt; string, string & amp; amp; gt; {["Alamat"] = "12 Dengan cara ini, di mana-mana", ["nama"] = "Bob Foo" ["title"] = "Master of the Universe"}; 

Saya tidak dapat berbicara untuk orang lain, tapi saya pikir itu benar-benar membuat kode lebih mudah dibaca. Catatan, bagaimanapun, bahwa sintaks ini indeks baru dapat dicampur dengan sintaks initializer konvensional; misalnya, itu tidak valid sebagai berikut:

 var = pasangan kamus baru & amp; amp; lt; string, string & amp; amp; gt; {{"Alamat", "12 cara ini, di mana saja"} ["nama"] = "Bob Foo" ["title"] = "Master of the Universe"}; 

Saya pikir itu baik-baik saja bahwa mereka tidak dapat dicampur bersama-sama. Salah satu cara adalah dengan Add () resolusi metode kelebihan diatur ke nilai-nilai lain dan pengindeks; ini menggunakan semantik yang berbeda dan implementasi sering memiliki konotasi yang berbeda. Dari itu, kode ini kacau dan kehilangan makna; Kami mengutip data yang terdapat dalam koleksi peta atau indeks spesifik untuk data mereka?


Akhirnya

Kedua perubahan yang rapat inisialisasi cukup halus. Untuk semua fungsi C # 6 membawa kita, ini bisa masuk yang jarang digunakan. Bahkan, ketika saya mulai menulis posting ini saya tidak yakin nilainya. Seperti yang saya tulis, memikirkan contoh penggunaan, aku datang untuk menyadari bahwa, meskipun mereka mungkin dalam situasi yang jarang terjadi, perubahan ini memberikan setiap koleksi initializer penambahan terbaik untuk bahasa C #. Lepaskan inisialisasi bit indeks kabur dari koleksi diindeks inisialisasi, seperti kamus, sedangkan perluasan Add () resolusi metode yang berlebihan adalah metode penyuluhan mengurangi jumlah jenis sembrono, kita harus menciptakan. Singkatnya, mereka dengan mudah memungkinkan kita untuk menulis kode yang jelas, dan itu adalah hal yang indah.

  1. Pre-C # 6 & amp; amp; nbsp;

  2. Contoh membangun untuk memastikan, tapi tidak ada-yang-kurang ilustrasi & amp; amp; nbsp;

  3. Sebagai daftar baris dari file aliran & amp; amp; nbsp;

  4. lebih jelas untuk LineEnumerator kemeja FileStream untuk menulis dan menggunakannya secara eksplisit & amp; amp; nbsp; ↩

Mencari Google Artikel href = "http://pinterest.com">

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>