C# 4.0 memperkenalkan tipe baru: dinamis, yang merupakan tipe statis, tetapi instans objek jenis ini dapat melewati proses pemeriksaan tipe statis. Dalam kebanyakan kasus, jenis berfungsi seperti kelas objek. Pada waktu kompilasi, instans kelas dinamis mendukung operasi apa pun, jadi tidak perlu khawatir apakah objek diambil dari API COM, atau bahasa dinamis seperti IronPython, dari DOM HTML, atau dari refleksi, atau di tempat lain dalam program. Namun, jika kode melakukan sesuatu yang tidak valid, kesalahan akan ditangkap saat runtime. Misalnya, contoh metode exampleMethod1 dalam cuplikan kode berikut hanya memiliki satu parameter, dan pengkompilasi dapat mengidentifikasi bahwa parameter tersebut tidak valid saat memanggil ec.exampleMethod1(10,4) pada waktu kompilasi; Ini adalah kesalahan kompilasi. Panggilan kedua dynamic_ec.exampleMethod1(10,4) tidak diperiksa untuk jenis statis. Oleh karena itu, compiler tidak melaporkan error kompilasi. Namun, bug itu tidak bersembunyi selamanya; Ini akan ditangkap saat runtime dan memicu pengecualian runtime. static void Main(string[] args){ ExampleClass ec = ExampleClass(); baru dynamic_ec dinamis = ExampleClass(); baru dynamic_ec.exampleMethod1(10, 4); dynamic_ec.someMethod("beberapa argumen", 7, null); dynamic_ec.nonexistentMethod();
} class ExampleClass { publik ExampleClass() { } publik ExampleClass(int v) { } public void exampleMethod1(int i) { } public void exampleMethod2(string str) { }
} Berikut adalah contoh penggunaan dinamis untuk memanggil IronPython:
menggunakan IronPython.Hosting; menggunakan Microsoft.scrip{filtering}ting. Menerima tamu;
Console.WriteLine("Memuat random.py..."); scrip{filter}tRuntime py = Python.CreateRuntime(); acak dinamis = py. UseFile("random.py"); Console.WriteLine("random.py dimuat!"); var item = Enumerable.Rentang (1, 7). ToArray();
untuk (int s = 0; s < 10000; s++) { acak.acak(item); Console.Write("Urutan {0}: ", s); foreach (int i dalam item) { Console.Write("{0} ", i); } Console.WriteLine();
}
Untuk objek atau ekspresi jenis dinamis, peran pengkompilasi adalah untuk merangkum tindakan yang diharapkan untuk dilakukan setiap ekspresi, dan pada saat eksekusi, periksa informasi yang disimpan, dan pernyataan yang tidak valid akan memicu pengecualian runtime. Jenis hasil dari sebagian besar operasi dinamis juga dinamis. Misalnya, jika Anda mengarahkan kursor mouse ke testSum dalam contoh berikut, perintah pintar akan menampilkan testSum dinamis (variabel lokal). dinamis d = 1; var testSum = d + 3; Arahkan penunjuk mouse ke testSum di bawah ini. System.Console.WriteLine(testSum);
Konversi jenis Transisi antara instans tipe Dinamis dan jenis instans lainnya sederhana, dan pengembang dapat dengan mudah beralih antara perilaku dinamis dan non-dinamis. Instans apa pun dapat dikonversi secara implisit menjadi instans tipe dinamis, lihat contoh berikut: dinamis d1 = 7; dinamis d2 = "string"; dinamis d3 = System.DateTime.Today; dinamis d4 = System.Diagnostics.Process.GetProcesses();
Sebaliknya, konversi implisit dapat diterapkan secara dinamis ke ekspresi jenis dinamis apa pun. Dan sebaliknya, ekspresi dinamis tipe apa pun juga dapat dikonversi secara implisit ke jenis lain. int i = d1; string str = d2; TanggalWaktu dt = d3; System.Diagnostics.Process[] procs = d4;
Masalah kelebihan beban dengan parameter tipe dinamis dalam metode Jika metode dipanggil melewati objek jenis dinamis, atau objek yang dipanggil adalah jenis dinamis, maka penilaian kelebihan beban terjadi pada runtime dan bukan pada waktu kompilasi.
DLR runtime bahasa dinamis Runtime bahasa dinamis adalah . NET Framework 4 Beta 1 adalah serangkaian API baru yang memberikan dukungan untuk jenis dinamis di C# dan juga mengimplementasikan bahasa pemrograman dinamis seperti IronPython dan IronRuby.
Interoperabilitas COM C# 4.0 mencakup beberapa fitur yang meningkatkan interoperabilitas dengan antarmuka COM API tradisional seperti otomatisasi Office. Jenis dinamis, parameter bernama, dan parameter opsional juga merupakan bagian dari peningkatan. Banyak metode COM mengizinkan parameter dan nilai pengembalian mereka menjadi objek jenis, jadi untuk bahasa yang diketik dengan kuat seperti C#, diperlukan banyak konversi tipe paksa. Namun, di C# 4.0, jika Anda menambahkan opsi /link pada waktu kompilasi, tipe dinamis memiliki efek baru: itu membuat jenis objek (jenis parameter atau tipe pengembalian) dalam tanda tangan metode antarmuka COM dianggap dinamis, sehingga menghindari banyak konversi jenis. Misalnya, pernyataan berikut membandingkan ini. Itu tidak digunakan dinamis. ((Excel.Range)excel. Sel[1, 1]). Value2 = "Nama"; Rentang Excel.Rentang = (Excel.Rentang)excel. Sel[1, 1];
Itu adalah yang dinamis. unggul. Sel[1, 1]. Nilai = "Nama"; Excel.Rentang rentang = excel. Sel[1, 1]; |