Setiap produk atau kerangka kerja berevolusi. Terutama itu dilakukan untuk mengejar kebutuhan pengguna itu, memanfaatkan kekuatan komputasi baru dan hanya membuatnya lebih baik. Terkadang tujuan desain utama juga berubah dengan produk. Kerangka kerja C # atau .net tidak terkecuali. Seperti yang kita lihat, versi 4 hari ini sangat berbeda dibandingkan dengan yang pertama. Tetapi hal datang sebagai barikade untuk kompatibilitas-mundur evolusi ini.
Dalam sebagian besar kerangka kerja / produk ada fitur yang akan terputus jika tidak perlu mendukung kompatibilitas mundur. Menurut Anda, apa saja fitur ini di C # /. Net?
Harap sebutkan satu fitur per jawaban.
c#
.net
features
backward-compatibility
Gulshan
sumber
sumber
Jawaban:
Metode anonim . Saya pikir semua orang setuju bahwa sintaksis metode anonim yang dipilih untuk C # 2.0 adalah chunky dan clunky dibandingkan dengan sintaks lambda yang kita tambahkan ke C # 3.0. Sangat disayangkan memiliki dua sintaksis yang hampir identik untuk melakukan hal yang sama.
sumber
Saya akan menyingkirkan koleksi Non-generik. Mereka adalah kekejian ... dan ada terlalu banyak kasus di mana saya menggunakan LINQ dan harus melakukan sesuatu seperti
Setiap kali saya harus melakukan itu, sebagian kecil dari jiwa saya mati.
sumber
batal sebagai tipe . Mengapa "void" adalah tipe? Tidak memiliki instance, tidak memiliki nilai, Anda tidak dapat menggunakannya sebagai argumen tipe generik, tipe parameter formal, tipe lokal, tipe bidang, atau tipe properti. Itu tidak memiliki arti sebagai tipe; melainkan, ini adalah fakta tentang apa efek pemanggilan metode terhadap tumpukan mesin virtual. Tapi mesin virtual itu hanya itu: mesin virtual. Mesin nyata akan memasukkan nilai yang dikembalikan ke register (biasanya EAX pada x86) dan tidak mempengaruhi tumpukan sama sekali! Batal sebagai tipe hanya ide buruk di sekitar.
Lebih buruk: ketika digunakan dalam jenis pointer seperti di
void*
dalamnya berarti sesuatu yang sama sekali berbeda dari apa artinya ketika digunakan sebagai tipe pengembalian. Sekarang ini berarti "penunjuk ke lokasi penyimpanan dengan tipe yang tidak dikenal", yang tidak ada hubungannya dengan artinya sebagai "metode yang tidak mengembalikan nilai apa pun."Kita dapat mengganti
void*
dengan tipe pointer denganIntPtr
. (Danvoid**
denganIntPtr*
dan seterusnya.) Kita dapat mengganti void sebagai tipe kembali dengan "Unit", tipe yang memiliki nilai tunggal, yaitu, null. Implementasi CLR kemudian dapat memutuskan bahwa panggilan fungsi unit-typed dapat mengoptimalkan penggunaan register atau tumpukan dengan tepat, mengetahui bahwa null yang sedang "dikembalikan" dapat diabaikan dengan aman.Di dunia seperti itu Anda tidak perlu lagi terpisah
Func<A, R>
danAction<T>
mendelegasikan.Action<T>
hanyaFunc<T, Unit>
.sumber
Task
hanya aTask<Unit>
. Mengimplementasikan kembali bit perpustakaan dari CTP async membuat saya benar-benar berharap untuk ini ...Pernyataan kosong
;
. Rawan kesalahan, hampir selalu salah ketik, dan tidak memberi Anda makna tambahan yang belum diungkapkan oleh{}
.sumber
Kovarians tidak aman pada array jenis referensi . Dengan aktifnya kovarians typesafe
IEnumerable<T>
, setidaknya sebagian kebutuhan akan kovarians array telah hilang. (Jika kita memiliki antarmuka daftar read-only kovarian maka kita tidak akan memerlukannya sama sekali.)sumber
IList<T>
diwarisi dariIReadableList<out T>
dan non-generikIPemutable
, itu bisa mendukung hal-hal seperti penyortiran, tetapi array mendukungnya dengan lebih mudah.Operator plus unary . Operator yang paling tidak berguna sepanjang masa. Jika kita tidak harus menyimpannya untuk backat compat, aku akan mengeluarkannya dalam sekejap. Siapa yang menggunakan benda ini, siapa pun?
(Klarifikasi: Operator unary plus
+x
bukan operator preincrement++x
, bukan operator postincrementx++
dan bukan operator penambahan binerx+y
.)sumber
+1 == 1
. Ini sangat dekat dengan no-op.if(a == +1 || a == -1){...}
.Mengalihkan literal angka ke
double
Untuk sebagian besar aplikasi bisnis ,
decimal
itu lebih tepat ... atau mungkin akan lebih baik untuk adil menghapus ide default, dan memaksa pengembang untuk benar-benar membuat pilihan.(Itu "menghapus default" akan sesuai untuk beberapa hal lain, juga. Sebagai contoh, saya sudah menyerah berusaha membujuk semua orang bahwa kelas harus ditutup secara default, tapi saya menduga lebih mudah untuk meyakinkan orang bahwa mereka harus berpikir tentang apakah kelas baru mereka harus disegel atau tidak, dan membuatnya eksplisit.)
sumber
Ini lebih merupakan pedoman daripada fitur, tapi saya pikir ini penting karena sudah terlalu tertanam dalam pikiran orang sebagai solusi kanonik dan terbaik:
The Pola resmi untuk melaksanakan
IDisposable
.Ini rumit dan ada cara yang lebih baik .
sumber
Saya tahu ada perbedaan besar antara berbagai kelas pengatur waktu. Tetapi, tidak bisakah kita menyingkirkan satu atau dua dari mereka?
sumber
Metode dan jenis
Array
danList<T>
yang menjadi usang dengan Linq, misalnya:Array.TrueForAll
dapat diganti denganEnumerable.All
Array.FindAll
dapat diganti denganEnumerable.Where
List<T>.ConvertAll
dapat diganti denganEnumerable.Select
Predicate<T>
dapat diganti denganFunc<T, bool>
Converter<T,R>
dapat diganti denganFunc<T, R>
IComparer<T>
benar-benar harus menjadi delegasiFunc<T, T, int>
sumber
Predicate<T>
karena menangkap maksud tentang bagaimana fungsi ini digunakan dan menyimpan sedikit pengetikan.Delegasi Non-generik Seperti koleksi non-generik, delegasi non-generik sekarang tidak berguna karena kita memiliki seri Func and Action. Dan saya akan memotong varian di tiga parameter. Jika Anda memiliki lebih dari tiga parameter, buat struktur dan gunakan itu sebagai parameter tunggal. Mendeklarasikan delegasi khusus untuk penanganan acara tidak terlalu KERING.
sumber
Layanan Web asmx
Saya pikir mereka cukup usang dengan WCF saat ini.
sumber
Winforms
Alangkah baiknya tidak harus menavigasi antara dua platform desktop. WPF adalah tujuan, jadi frustasi untuk memiliki redundansi tingkat platform penuh.
sumber