var
diketik statis - kompiler dan runtime tahu jenisnya - mereka hanya menghemat beberapa pengetikan ... berikut ini 100% identik:
var s = "abc";
Console.WriteLine(s.Length);
dan
string s = "abc";
Console.WriteLine(s.Length);
Semua yang terjadi adalah bahwa compiler tahu itu s
harus berupa string (dari initializer). Dalam kedua kasus, ia tahu (dalam IL) yang s.Length
berarti properti (instance) string.Length
.
dynamic
adalah binatang yang sangat berbeda; ini paling mirip dengan object
, tetapi dengan pengiriman dinamis:
dynamic s = "abc";
Console.WriteLine(s.Length);
Di sini, s
diketik sebagai dinamis . Tidak tahu string.Length
, karena tidak tahu apa - apa tentang s
waktu kompilasi. Misalnya, berikut ini akan mengkompilasi (tetapi tidak berjalan) juga:
dynamic s = "abc";
Console.WriteLine(s.FlibbleBananaSnowball);
Pada saat runtime (hanya), itu akan memeriksa untuk FlibbleBananaSnowball
properti - gagal untuk menemukannya, dan meledak di mandi bunga api.
Dengan dynamic
, properti / metode / operator / dll diselesaikan pada saat runtime , berdasarkan objek yang sebenarnya. Sangat berguna untuk berbicara dengan COM (yang dapat memiliki sifat runtime-only), DLR, atau sistem dinamis lainnya javascript
.
var
dapat menyimpulkan jenis yang mungkin tidak diinginkan karena subtipe dan gips tersirat. Artinya,var
mungkin telah menyelesaikan jenis yang secara statis berbeda dari yang diharapkan ketika gips implisit terjadi (terutama untuk jenis yang lebih umum, tetapi tidak terbatas pada ini). Contoh sepele adalahobject x = ""
vs.var x = ""
vs.var x = "" as object
, tetapi kasus lain yang lebih licik (dan realistis) dapat terjadi dan dapat menyebabkan bug halus.WriteLine
panggilan. Ini "mengikat" terjadi waktu kompilasi. Dalam kasus dengandynamic
, jenis.Length
harusdynamic
terlalu, dan tidak sampai run-time diputuskan yang kelebihan (jika ada sama sekali) yangWriteLine
paling cocok. Binding terjadi saat run-time.var
kata kunci di Visual Studio, tipe aktual ditampilkan yang disimpulkan. Menunjukkan kepada Anda bahwa jenisnya diketahui pada waktu kompilasi.Variabel yang dideklarasikan dengan var secara implisit tetapi diketik secara statis . Variabel yang dideklarasikan dengan dinamis diketik secara dinamis. Kemampuan ini ditambahkan ke CLR untuk mendukung bahasa dinamis seperti Ruby dan Python.
Saya harus menambahkan bahwa ini berarti bahwa deklarasi dinamis diselesaikan pada saat run-time, deklarasi var diselesaikan pada waktu kompilasi.
sumber
Saya akan menjelaskan perbedaan antara dinamis dan var .
Ini akan bekerja kompiler dapat membuat kembali jenis variabel dinamis .
pertama-tama ia membuat tipe sebagai integer dan setelah itu kompiler akan membuat kembali tipe sebagai string
tetapi dalam kasus var
sumber
var menyiratkan bahwa pengecekan tipe statis (penjilidan awal) diterapkan. dynamic menyiratkan bahwa pengecekan tipe dinamis (late binding) diterapkan. Dalam hal kode, pertimbangkan hal berikut:
Jika Anda mengompilasi ini dan memeriksa hasilnya dengan ILSpy, Anda akan menemukan bahwa kompiler telah menambahkan beberapa kode pengikatan akhir yang akan menangani panggilan ke Hello () dari b, sedangkan karena pengikatan awal diterapkan ke a, a dapat memanggil Hello () secara langsung.
mis. (pembongkaran ILSpy)
Hal terbaik yang dapat Anda lakukan untuk menemukan perbedaannya adalah menulis sendiri aplikasi konsol kecil seperti ini, dan mengujinya sendiri dengan ILSpy.
sumber
Satu perbedaan besar - Anda dapat memiliki tipe pengembalian dinamis.
sumber
Berikut adalah contoh sederhana yang menunjukkan perbedaan antara Dynamic (4.0) dan Var
Siwa Mamidi
sumber
**
karakter dalam contoh kode dimaksudkan untuk menunjukkan penekanan saja dan tidak dimaksudkan untuk menjadi bagian dari kode kerja nyata.var
hanyalah singkatan untuk deklarasi tipe normal, di mana Anda membiarkan kompiler menebak tipe yang benar.dynamic
adalah tipe baru (statis), di mana semua pemeriksaan dilakukan pada saat runtime, bukan oleh kompiler.sumber
Tipe variabel yang dideklarasikan dengan var ditentukan oleh kompiler, itu adalah jalan pintas untuk menentukan nama tipe, tidak lebih.
Namun dinamis ditentukan saat runtime, kompiler tidak tahu jenis sebenarnya, dan semua metode / bidang / properti mengakses dengan variabel itu akan dikerjakan saat runtime.
sumber
Ini adalah video youtube yang bagus yang berbicara tentang
var
VSDynamic
dengan peragaan praktis.Di bawah ini adalah penjelasan yang lebih rinci dengan snapshot.
Var diikat awal (diperiksa secara statis) sementara dinamis diikat lebih lambat (dievaluasi secara dinamis).
Kata kunci var melihat data sisi kanan Anda dan kemudian selama waktu kompilasi menentukan jenis data tangan kiri. Dengan kata lain var kata kunci hanya menghemat Anda mengetik banyak hal. Lihat gambar di bawah ini di mana ketika kami telah memberikan data string dan variabel x menunjukkan tipe data string di tip alat saya.
Di sisi lain, kata kunci dinamis untuk tujuan yang sama sekali berbeda. Objek dinamis dievaluasi selama runtime. Misalnya dalam kode di bawah ini properti "Panjang" ada atau tidak dievaluasi selama runtime. Saya sengaja mengetik "l" kecil, jadi program ini dikompilasi dengan baik tetapi ketika benar-benar dieksekusi itu memunculkan kesalahan ketika properti "panjang" disebut (KECIL "l").
sumber
variabel dinamis dan variabel var keduanya dapat menyimpan semua jenis nilai tetapi diperlukan untuk menginisialisasi 'var' pada saat deklarasi.
Compiler tidak memiliki informasi tentang tipe variabel 'dinamis'. var adalah kompiler aman yaitu kompiler memiliki semua informasi tentang nilai yang disimpan, sehingga tidak menyebabkan masalah saat dijalankan.
Tipe dinamis dapat diteruskan sebagai argumen fungsi dan fungsi juga dapat mengembalikannya. Jenis Var tidak dapat diteruskan sebagai argumen fungsi dan fungsi tidak dapat mengembalikan jenis objek. Jenis variabel ini dapat bekerja dalam lingkup di mana ia didefinisikan.
Dalam hal Pengecoran dinamis tidak diperlukan tetapi Anda perlu mengetahui properti dan metode yang terkait dengan tipe tersimpan, sedangkan untuk var Tidak perlu melakukan casting karena kompiler memiliki semua informasi untuk melakukan operasi.
dynamic: Berguna saat pengkodean menggunakan refleksi atau dukungan bahasa dinamis atau dengan objek COM, karena kita perlu menulis lebih sedikit kode.
var: Berguna saat mendapatkan hasil dari permintaan LINQ. Dalam kerangka 3.5 itu memperkenalkan untuk mendukung fitur LINQ.
Referensi: Counsellingbyabhi
sumber
sumber
Jangan bingung antara dinamis dan var. Mendeklarasikan variabel lokal menggunakan var hanyalah pintasan sintaksis yang membuat kompiler menyimpulkan tipe data spesifik dari ekspresi. Kata kunci var hanya dapat digunakan untuk mendeklarasikan variabel lokal di dalam suatu metode sementara kata kunci dinamis dapat digunakan untuk variabel lokal, bidang, dan argumen. Anda tidak bisa memberikan ekspresi ke var, tetapi Anda bisa memberikan ekspresi ke dinamis. Anda harus secara eksplisit menginisialisasi variabel yang dideklarasikan menggunakan var sementara Anda tidak harus menginisialisasi variabel yang dideklarasikan dengan dinamis.
sumber
Contoh:
Tetapi dalam tipe Dinamis, tipe yang mendasarinya ditentukan hanya pada waktu berjalan. Tipe data dinamis tidak dicentang pada waktu kompilasi dan juga tidak diketik dengan kuat. Kami dapat menetapkan nilai awal apa pun untuk tipe dinamis dan kemudian dapat dipindahkan ke yang baru nilai selama waktu hidupnya.
Contoh:
Itu tidak memberikan dukungan IntelliSense juga. Tidak memberikan dukungan yang lebih baik ketika kami bekerja dengan linq juga. Karena itu tidak mendukung ekspresi lambda, metode ekstensi dan metode anonim.
sumber
Inilah perbedaannya
var diketik secara statis (waktu kompilasi), dinamis diketik secara dinamis (waktu berjalan)
Variabel yang dideklarasikan sebagai var hanya dapat digunakan secara lokal, variabel dinamis dapat diteruskan sebagai params berfungsi (tanda tangan fungsi dapat mendefinisikan param sebagai dinamis tetapi tidak var).
dengan dinamis resolusi properti terjadi pada saat runtime dan tidak demikian halnya dengan var yang berarti pada waktu kompilasi, variabel apa pun yang dideklarasikan sebagai dinamis dapat memanggil metode yang mungkin ada atau tidak ada sehingga kompiler tidak akan membuat kesalahan.
Ketik casting dengan var tidak mungkin tetapi dengan dinamis itu mungkin (Anda dapat melemparkan objek sebagai dinamis tetapi tidak sebagai var).
Arun Vijayraghavan
sumber