Kekurangan menggunakan tipe dinamis di C #


14

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.


3
Dalam C # 3, saya selalu menganggap penggunaan objectatau 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 penggunaan dynamicjuga. Saya dapat melihat kasusnya jika Anda membuat semuanya dinamis, tetapi dalam hal itu Anda mungkin juga telah memilih bahasa yang diketik secara dinamis. * 8 ')
Mark Booth

@MarkBooth +1 untuk perspektif. Apakah aman untuk mengatakan bahwa implementasi inti menggunakan C # masih akan tetap diketik meskipun memperkenalkan tipe dinamis di 4.0
Karthik Sreenivasan

Menggunakan dynamicdalam 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 menggunakan dynamicuntuk mewakili operan ekspresi dan hasil dari evaluasi.
Ed James

@ Edames - Kedengarannya seperti penggunaan yang bagus 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.
Mark Booth

Jawaban:


16

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


+1 untuk IronPython. Ini berarti bahwa ini dapat menyebabkan masalah pemeliharaan dalam jangka panjang.
Karthik Sreenivasan

6
Hal besar yang dynamicmemberi Anda adalah kemampuan untuk melemparkan objek ke jenis yang sebenarnya tanpa jenis retasan hack. Misalnya jika Base foo = new Derived();dan ada dua metode kelebihan beban Moo(Base x)dan Moo(Derived x), kemudian Moo(foo)panggilan Moo(Base x), tetapi Moo((dynamic)foo)panggilan Moo(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.

@TheMouthofaCow Bagus, pasti ada beberapa kegunaan "sah" untuk dinamika juga, namun ini sedikit dan jauh di antara (dan Anda pasti harus tahu apa yang Anda lakukan sebelum mencoba sesuatu seperti ini).
Matěj Zábský

@TheMouthofaCow Pola desain yang relatif baru (Pola Pengunjung) untuk dicatat. Terima kasih.
Karthik Sreenivasan

1
Ya, sangat keren. Saya datang dengan itu secara independen minggu lalu, jadi itu bagus untuk melihat bahwa itu adalah ide yang diterima yang telah diadopsi ke dalam arsenal C #.

9

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:

  1. Metode ekstensi tidak berfungsi. Ini mungkin yang terbesar. Jika sudah dynamic collection, Anda tidak dapat menggunakan kode seperti collection.Distinct(). Itu karena metode ekstensi yang tersedia tergantung pada namespace usingdan 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 seperti IEnumerable<dynamic>.

  2. foreachmembutuhkan IEnumerable. Dalam C # normal, foreachberbasis pola. Artinya, tidak memerlukan antarmuka khusus, hanya GetEnumerator()metode yang mengembalikan objek yang sesuai. Jika Anda menggunakan foreachpada dynamic, implementasi IEnumerablediperlukan. Tetapi karena alasan perilaku ini adalah bahwa C # 1.0 tidak memiliki obat generik, "kekurangan" ini sangat tidak relevan.


+1 untuk metode ekstensi. Apakah ini juga berlaku untuk operator kueri LINQ lain seperti GroupBy ()?
Karthik Sreenivasan

2
@Arthik: Ya, benar. Saya pikir metode penyuluhan mengkompilasi waktu sintaksis gula, maka fakta bahwa mereka tidak terselesaikan.

@TheMouthofaCow +1 - Terima kasih atas klarifikasi.
Karthik Sreenivasan

1
Saya setuju dengan metode ekstensi, yaitu bagaimana dinamis tidak dapat mengetahui metode ekstensi pada waktu berjalan tetapi saya tidak dapat mengikuti koleksi dinamis yang telah Anda jelaskan.
Karthik Sreenivasan

7

Masalah dengan tipe dinamis (bukan variabel yang dinyatakan dinamis) di .net adalah mereka tidak memiliki banyak fungsi yang tersedia untuk tipe statis.

  • tidak ada refleksi (Anda bisa beralih pada anggota tetapi tidak banyak yang lain)
  • tidak ada metadata (hilang validasi Anda di situs data dinamis / mvc)
  • sama sekali tidak memeriksa pada waktu kompilasi (salah eja tidak akan ditangkap)
  • karena ini adalah fitur yang kuat, noobs mungkin cenderung menyalahgunakan / menyalahgunakan / salah paham
  • kode yang ditulis dengan tipe dinamis cenderung sulit untuk dipertahankan dan sangat sulit untuk diperbaiki
  • karena mengetik bebek dan fitur lainnya guru dapat menulis kode yang tidak dapat dibaca oleh orang lain

Jadi jangan menulis kode dengan tipe dinamis kecuali Anda tahu apa yang Anda lakukan.


6

Karena dynamichanya bertanda objectitu 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.


+1 Saya pasti setuju. Pengetikan statis akan menjadi pendekatan terbaik untuk kode kritis kinerja.
Karthik Sreenivasan
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.