Saya perhatikan ketika berhadapan dengan Ekspresi atau Pohon Ekspresi. Saya banyak menggunakan refleksi untuk menetapkan dan mendapatkan nilai dalam properti dan apa pun yang Anda miliki. Terlintas dalam benak saya bahwa penggunaan refleksi tampaknya semakin umum. Hal-hal seperti DataAnotations untuk validasi, Atribut ORM berat, dll. Pernahkah saya bertanya-tanya: Apa yang telah berubah sejak hari-hari yang lalu ketika saya dulu diberitahu untuk menghindari refleksi jika mungkin?
Jadi apa, jika ada yang berubah? Apakah hanya kecepatan mesin? Apakah ada perubahan pada kerangka kerja untuk mempercepat refleksi?
Atau tidak ada yang benar-benar berubah? Apakah masih "buruk" atau "lambat" untuk menggunakan refleksi?
.net
reflection
daging
sumber
sumber
Jawaban:
Refleksi tidak buruk, juga tidak lambat. Ini hanyalah alat. Seperti semua alat, itu sangat berharga untuk skenario tertentu, tidak begitu berharga untuk orang lain.
Jika kinerja benar-benar masalah, Anda selalu dapat menggunakan perpustakaan seperti FasterFlect .
Bacaan Lebih Lanjut
Jika refleksi tidak efisien, kapan itu paling tepat?
sumber
dynamic
- tampaknya urutan besarnya lebih cepat daripada refleksi.Alasan orang waspada menggunakan refleksi yang tidak perlu bukanlah kinerja: ya, ada beberapa overhead untuk menggunakan refleksi, tetapi seringkali, menyelesaikan masalah tanpa itu memerlukan pendekatan yang berbeda dengan kompleksitas yang sebanding, dan bahkan jika tidak, biaya overhead adalah jarang signifikan (terutama untuk pengembangan tingkat aplikasi).
Menggunakan refleksi, beberapa asumsi penting yang biasanya dapat dibuat tentang kode sumber rusak, dan alat-alat seperti "Temukan Semua Referensi" berhenti bekerja dengan andal. Refleksi pada dasarnya juga menghapus sebagian besar jenis keselamatan yang diberlakukan oleh kompiler, katakanlah, C #, dan sebagian besar kesalahan pemrograman yang biasanya ditemui oleh sistem tipe dan diterjemahkan ke dalam kesalahan kompiler, sekarang menjadi kesalahan runtime yang terbaik atau bug yang sangat tidak jelas yang terburuk.
Jadi mengapa orang menggunakan refleksi itu? Sederhananya, karena meskipun masalah yang dijelaskan di atas, itu adalah alat yang sangat berharga. Dengan refleksi, beberapa manfaat pemrograman dinamis dapat dimiliki dalam bahasa statis yang diketik dengan ketat seperti C #, dan bahasa pemrograman dinamis telah menunjukkan kemampuannya baru-baru ini, terutama dalam bidang pemrograman web - PHP, Javascript, dan Python yang cukup menonjol , semua menggunakan pengetikan dinamis, dan telah terbukti cocok untuk pemrograman web. Tetapi karena bahasanya masih C #, Anda dapat memilih untuk menyimpan sebagian besar aplikasi Anda dalam idiom OOP yang diketik dengan ketat, dan menulis bagian kecil di mana perilaku dinamis benar-benar membuat perbedaan dengan refleksi.
Contoh khas adalah ketika Anda perlu mengekspos metode sebagai panggilan layanan web (menggunakan protokol yang belum dibangun ke dalam .NET). Pendekatan OOP yang diketik secara ketat memang berhasil, tetapi terlalu ketat dan kaku. Tetapi jika Anda menggunakan refleksi untuk memetakan panggilan ke metode dan pasangan kunci / nilai untuk argumen, Anda bisa menulis pipa ledeng untuk layanan web seperti itu sekali dan kemudian menggunakannya pada kelas yang Anda suka.
sumber
Refleksi masih jauh lebih lambat daripada panggilan langsung. Dua hal telah berubah:
Bersama-sama, kedua faktor ini telah membawa biaya refleksi ke titik di mana Anda dapat menggunakannya secara rutin (jika perlu dari POV pemeliharaan) dan menunggu profiler memberi tahu Anda apakah itu sebenarnya hambatan (dan cukup yakin bahwa sebagian besar waktu tidak).
sumber