.NET 4.5Dua antarmuka koleksi baru, IReadOnlyList dan IReadOnlyDictionary, telah ditambahkan. Meskipun antarmuka ini mungkin tampak sangat biasa di permukaan, mereka mengungkapkan cerita yang cukup kompleks tentang kompatibilitas mundur, interoperabilitas, dan peran ko-mutabilitas.
IReadOnlyList dan IReadOnlyDictionary adalah dua antarmuka yang selalu ingin dimiliki pengembang .NET. Selain memberikan beberapa rasa simetri (berlawanan dengan antarmuka yang dapat ditulis), antarmuka hanya-baca harus menghilangkan implementasi metode yang hanya melemparkan pengecualian NotSupportedException dan tidak melakukan apa-apa. Semua ini tidak selesai karena keterbatasan waktu.
Kesempatan berikutnya sudah masuk. BERSIH 2.0. Hal ini memungkinkan Microsoft untuk menghentikan koleksi yang diketik dengan lemah dan menggantinya dengan koleksi rekan yang diketik dengan kuat. Namun, tim perpustakaan dasar[1] sekali lagi melewatkan kesempatan untuk memberikan daftar hanya-baca, seperti yang ditulis Kit George,
Karena kami bermaksud untuk menyediakan implementasi default untuk masalah yang Anda bicarakan dengan Joe, alih-alih memberikan antarmuka, kami menyediakan kelas dasar ReadOnlyCollectionBase. Namun, saya bisa mengerti mengapa orang enggan menggunakannya karena bukan tipe yang kuat. Tetapi dengan diperkenalkannya generik, kami sekarang juga memiliki ReadOnlyCollection<T>, sehingga Anda tidak hanya mendapatkan fungsionalitas yang sama, tetapi juga jenis yang kuat: bagus!
Karena ReadOnlyCollection <T>bukan kelas tertutup, Anda dapat menulis koleksi Anda sendiri dengan kecepatan penuh jika perlu. Karena koleksi yang telah kami buat untuk ini dapat disesuaikan dengan kebutuhan umum, kami tidak berencana untuk memperkenalkan antarmuka untuk konsep yang sama ini. Krzysztof Cwalina juga mengungkapkan pendapatnya tentang topik ini,
Apakah ini terdengar mengejutkan atau tidak, IList dan IList <T>adalah dua antarmuka yang ingin kami gunakan untuk koleksi hanya-baca. Keduanya memiliki properti boolean IsReadOnly, yang harus mengembalikan true saat koleksi baca-saja mengimplementasikan properti ini. Alasan kami tidak ingin menambahkan antarmuka hanya-baca murni adalah karena kami merasa itu menambahkan terlalu banyak kerumitan yang tidak perlu ke perpustakaan dasar. Perhatikan bahwa dalam hal kompleksitas, kami mengacu pada antarmuka baru ini dan konsumennya.
Kami percaya bahwa jika desainer API tidak peduli tentang memeriksa properti IsReadOnly saat runtime dan pengecualian yang mungkin dilemparkan, maka tidak apa-apa untuk menggunakan antarmuka IList dalam hal ini; Jika mereka bersedia menyediakan API khusus yang benar-benar bersih sekaligus, maka dalam hal ini mereka harus menunjukkan implementasi antarmuka IList dan menerbitkan API hanya-baca yang disesuaikan. Yang terakhir ini khas untuk koleksi yang diekspos dari model objek. Meskipun pengembang telah mengeluh tentang situasi ini, peluang baru yang diberikan oleh obat generik jauh lebih besar daripada inti ini dan masalahnya ada di . NET 4 sebagian besar diabaikan sebelumnya. Namun, keputusan ini juga memicu beberapa reaksi, yang akan kita bahas nanti.
Dengan masuk. Fitur baru yang menarik di .NET 4 telah ditambahkan ke runtime. Dalam versi sebelumnya. .NET, ketika antarmuka menjadi jenis, antarmuka tersebut terlalu dibatasi. Misalnya, meskipun Pelanggan mewarisi dari Person, tidak mungkin meneruskan objek tipe IEnumerable <Customer>sebagai parameter ke fungsi tipe IEnumerable<Person>. Dengan penambahan dukungan kovarian, pembatasan ini sebagian dicabut.
Kami mengatakan "sebagian" karena dalam beberapa kasus orang harus menggunakan beberapa antarmuka dengan API yang kaya sekaligus, daripada menggunakan antarmuka IEnumerable. Bahkan jika antarmuka IList bukan kovarian, antarmuka daftar hanya-baca harus ada. Sayangnya, . Tim library basis .NET sekali lagi memutuskan untuk tidak menangani pengawasan ini.
Kemudian pengenalan WinRT dan comeback COM mengubah segalanya. Interoperabilitas COM pernah menjadi teknologi yang akan digunakan pengembang ketika mereka tidak punya pilihan lain, tetapi telah menjadi . Landasan pemrograman .NET. Dan karena WinRT mengekspos antarmuka IVectorView <T>dan IMapView<K, V>, oleh karena itu. .NET juga harus disesuaikan.
Salah satu fitur menarik dari program WinRT adalah pengumuman API yang berbeda tetapi serupa untuk setiap platform pengembangan. Seperti yang mungkin sudah Anda ketahui, semua nama metode diwakili oleh camelCased [2], sedangkan pengembang C++ dan .NET melihat nama metode sebagai PascalCased [3]. Perubahan lain yang lebih drastis adalah pemetaan otomatis antara antarmuka C++ dan .NET. Karena itu. Pengembang .NET tidak perlu berurusan dengan namespace Windows.Foundation.Collections, cukup lanjutkan menggunakan namespace System.Collections.Generic. Antarmuka IVectorView <T>dan IMapView<K, V> akan dikonversi oleh runtime menjadi antarmuka IReadOnlyList <T>dan antarmuka IReadOnlyDictionary<TKey, TValue> masing-masing.
Perlu dicatat bahwa nama-nama antarmuka ini di C++/WinRT lebih akurat sampai batas tertentu. Antarmuka ini digunakan untuk mewakili beberapa tampilan koleksi, tetapi antarmuka tidak memastikan bahwa koleksi itu sendiri tidak dapat diubah. Bahkan di antara mereka yang berpengalaman. Kesalahan umum di antara pengembang .NET adalah berasumsi bahwa jenis ReadOnlyCollection adalah salinan dari koleksi yang tidak dapat diubah, tetapi sebenarnya itu hanya pembungkus untuk koleksi aktif (lihat posting Andrew Arnott dengan nama yang sama untuk informasi selengkapnya tentang koleksi baca-saja, beku, dan tidak dapat diubah).
Meskipun antarmuka IList <T>memiliki semua anggota yang sama dengan antarmuka IReadOnlyList<T>, dan semua daftar tipe IList <T>dapat direpresentasikan sebagai daftar hanya-baca, IList <T>tidak mewarisi dari IReadOnlyList<T>, yang mungkin menarik untuk dipelajari. Immo Landwerth menjelaskan,
Alasannya berfungsi adalah karena antarmuka hanya-baca tersebut adalah subset murni dari antarmuka baca-tulis, yang tampaknya seperti asumsi yang masuk akal. Sayangnya, asumsi ini tidak sesuai dengan kenyataan, karena setiap metode pada setiap antarmuka di tingkat metadata memiliki slotnya sendiri (yang membuat implementasi antarmuka eksplisit bekerja). Atau dengan kata lain, satu-satunya kesempatan untuk memperkenalkan antarmuka hanya-baca sebagai beberapa kelas dasar kelas variabel adalah kembali ke . NET 2.0, yaitu ketika mereka awalnya dikandung. Setelah diluncurkan sepenuhnya, satu-satunya perubahan yang dapat dilakukannya adalah menambahkan penanda kovarian dan/atau inverter (diwakili sebagai "masuk" dan "keluar" dalam VB dan C#).
Ketika ditanya mengapa tidak ada antarmuka IReadOnlyCollection<T>, Immo menjawab,
Kami mempertimbangkan desain ini, tetapi kami merasa bahwa menambahkan jenis yang hanya menyediakan atribut Count tidak akan menambah banyak nilai ke pustaka dasar. Di tim library dasar, kami percaya bahwa jika API dimulai dari minus 1000, maka bahkan memberikan beberapa nilai tidak cukup untuk membenarkan penambahan. Alasan untuk menambahkan API baru juga mencakup biaya, misalnya, pengembang akan memiliki lebih banyak konsep untuk dipilih. Awalnya kami berpikir bahwa menambahkan jenis ini akan membuat kode berkinerja lebih baik dalam skenario tertentu di mana Anda hanya ingin mendapatkan hitungan dan kemudian melakukan sesuatu yang menarik dengannya. Misalnya, tambahkan massal ke koleksi yang ada. Namun, dalam skenario ini, kami telah mendorong orang untuk hanya menggunakan antarmuka IEnumerable<T>, dan <T>untuk kasus khusus memiliki instance yang mengimplementasikan antarmuka ICollection. Karena semua jenis koleksi bawaan kami mengimplementasikan antarmuka ini, tidak ada peningkatan performa dalam skenario yang paling umum tersebut. Ngomong-ngomong, <T>metode ekstensi Count() untuk IEnumerable juga dapat melakukan ini. Antarmuka baru ini tersedia untuk . NET 4.5 dan . NET untuk Windows 8。
Catatan terjemahan
[1] Perpustakaan Kelas Dasar, disingkat BCL. Untuk informasi lebih lanjut tentang perpustakaan kelas dasar, silakan berpartisipasi dalam MSDN.
[2] untaNomenklatur punuk, casel, juga dikenal sebagai kasus unta bawah. Formatnya adalah kata pertama dimulai dengan huruf kecil; Huruf pertama dari kata kedua dikapitalisasi, misalnya: firstName, lastName.
[3] PascalCased, nomenklatur Pascal, juga dikenal sebagai kasus unta atas. Formatnya adalah huruf pertama dari setiap kata dikapitalisasi, misalnya: FirstName, LastName, CamelCase. |