Saya baru-baru ini belajar lebih banyak tentang tipe dinamis dalam C #. Dengan beberapa contoh yang saya mengerti setelah kode dikompilasi, tidak perlu dikompilasi lagi tetapi dapat dieksekusi langsung.
Saya merasa fleksibilitas yang diberikan oleh kata kunci untuk benar-benar dapat mengubah tipe data sesuka hati adalah keuntungan besar .
Pertanyaan,
Apakah ada kekurangan khusus selain dari pemanggilan metode dinamis yang salah yang membuang pengecualian waktu yang harus diketahui pengembang sebelum memulai implementasi.
c#
.net
visual-studio-2010
Karthik Sreenivasan
sumber
sumber
object
atau gips tipe langsung menjadi bau kode. Dalam hampir setiap kasus itu berarti bahwa saya atau salah satu dari tim saya belum merancang antarmuka yang sesuai untuk fungsi itu. Saya menduga bahwa jika saya menggunakan C # 4 sekarang, saya akan merasa cukup banyak cara yang sama tentang penggunaandynamic
juga. Saya dapat melihat kasusnya jika Anda membuat semuanya dinamis, tetapi dalam hal itu Anda mungkin juga telah memilih bahasa yang diketik secara dinamis. * 8 ')dynamic
dalam C # berarti Anda tidak perlu keluar ke IronPython jika semua yang Anda butuhkan adalah pengetikan dinamis untuk sebagian kecil dari kode Anda. Untuk evaluator ekspresi, saya telah sangat sukses menggunakandynamic
untuk mewakili operan ekspresi dan hasil dari evaluasi.dynamic
, ditambah saya berharap saya tahu tentang IronPython ketika saya sedang mengembangkan dengan. Net - itu bisa membuat hal-hal tertentu yang kami coba lakukan menjadi lebih mudah.Jawaban:
Kelemahan utama adalah bahwa Anda membuang salah satu properti utama (belum tentu keuntungan) dari C # - yang diketik secara statis (dan untuk sebagian besar tipe aman).
Masalah dengan pengetikan dinamis adalah seringnya menyembunyikan bug yang akan terungkap saat kompilasi. Bug tersebut kemudian hanya bermanifestasi pada saat dijalankan, yang tentu saja membuatnya lebih sulit untuk dideteksi.
Ada sedikit alasan IMO untuk menggunakan pengetikan dinamis dalam C #, yang utama adalah kolaborasi dengan bahasa yang diketik secara dinamis (yaitu AFAIK alasan mengapa dinamika diperkenalkan di tempat pertama).
Jika Anda ingin melakukan pemrograman yang diketik sepenuhnya secara dinamis, Anda harus melihat beberapa bahasa yang dirancang untuk menjadi dinamis, bukan meretas C # menjadi dinamis. Anda dapat menggunakan misalnya IronPython jika Anda ingin menggunakan perpustakaan .Net
sumber
dynamic
memberi Anda adalah kemampuan untuk melemparkan objek ke jenis yang sebenarnya tanpa jenis retasan hack. Misalnya jikaBase foo = new Derived();
dan ada dua metode kelebihan bebanMoo(Base x)
danMoo(Derived x)
, kemudianMoo(foo)
panggilanMoo(Base x)
, tetapiMoo((dynamic)foo)
panggilanMoo(Derived x)
. Ini mengarah pada penerapan pola Pengunjung yang sangat elegan misalnya: code.logos.com/blog/2010/03/… dan pada umumnya merupakan teknik yang sangat kuat.Saya tidak yakin apa jenis kekurangan yang Anda cari, tetapi jika Anda ingin tahu tentang fitur yang bekerja dengan pengetikan statis, tetapi tidak dengan
dynamic
, ada beberapa:Metode ekstensi tidak berfungsi. Ini mungkin yang terbesar. Jika sudah
dynamic collection
, Anda tidak dapat menggunakan kode seperticollection.Distinct()
. Itu karena metode ekstensi yang tersedia tergantung pada namespaceusing
dan DLR tidak memiliki cara untuk mengetahuinya.Sebagai solusi, Anda baik dapat memanggil metode seperti apakah itu metode statis biasa:
Enumerable.Distinct(collection)
. Atau Anda dapat mengubah jenis koleksi menjadi sesuatu sepertiIEnumerable<dynamic>
.foreach
membutuhkanIEnumerable
. Dalam C # normal,foreach
berbasis pola. Artinya, tidak memerlukan antarmuka khusus, hanyaGetEnumerator()
metode yang mengembalikan objek yang sesuai. Jika Anda menggunakanforeach
padadynamic
, implementasiIEnumerable
diperlukan. Tetapi karena alasan perilaku ini adalah bahwa C # 1.0 tidak memiliki obat generik, "kekurangan" ini sangat tidak relevan.sumber
Masalah dengan tipe dinamis (bukan variabel yang dinyatakan dinamis) di .net adalah mereka tidak memiliki banyak fungsi yang tersedia untuk tipe statis.
Jadi jangan menulis kode dengan tipe dinamis kecuali Anda tahu apa yang Anda lakukan.
sumber
Karena
dynamic
hanya bertandaobject
itu kotak nilai jenis.Ini dapat memiliki implikasi kinerja, tetapi karena saya menggunakan pengetikan statis dalam kode kritis kinerja, mungkin itu bukan masalah dalam praktiknya.
Tinju ini juga mengganggu tipe nilai yang bisa berubah. Jika Anda memodifikasinya
dynamic
, Anda hanya memodifikasi salinan kotak. Tetapi karena Anda tidak boleh menggunakan tipe nilai yang bisa berubah di tempat pertama, ini juga bukan masalah besar.sumber