Bagikan melalui


Menggunakan jenis dinamis

Jenisnya dynamic adalah jenis statis, tetapi objek jenis dynamic melewati pemeriksaan jenis statis. Dalam kebanyakan kasus, fungsinya seperti memiliki jenis object. Pengkompilasi mengasumsikan dynamic elemen mendukung operasi apa pun. Oleh karena itu, Anda tidak perlu menentukan apakah objek mendapatkan nilainya dari COM API, dari bahasa dinamis seperti IronPython, dari HTML Document Object Model (DOM), dari refleksi, atau dari tempat lain dalam program. Namun, jika kode tidak valid, kesalahan muncul pada waktu proses.

Misalnya, jika metode exampleMethod1 instans dalam kode berikut hanya memiliki satu parameter, pengkompilasi mengenali bahwa panggilan pertama ke metode , ec.exampleMethod1(10, 4)tidak valid karena berisi dua argumen. Panggilan menyebabkan kesalahan kompilator. Pengkompilasi tidak memeriksa panggilan kedua ke metode , dynamic_ec.exampleMethod1(10, 4)karena jenisnya dynamic_ec adalah dynamic. Oleh karena itu, tidak ada kesalahan kompilator yang dilaporkan. Namun, kesalahan tidak luput dari pemberitahuan tanpa batas waktu. Ini muncul pada waktu proses dan menyebabkan pengecualian run-time.

static void Main(string[] args)
{
    ExampleClass ec = new ExampleClass();
    // The following call to exampleMethod1 causes a compiler error
    // if exampleMethod1 has only one parameter. Uncomment the line
    // to see the error.
    //ec.exampleMethod1(10, 4);

    dynamic dynamic_ec = new ExampleClass();
    // The following line is not identified as an error by the
    // compiler, but it causes a run-time exception.
    dynamic_ec.exampleMethod1(10, 4);

    // The following calls also do not cause compiler errors, whether
    // appropriate methods exist or not.
    dynamic_ec.someMethod("some argument", 7, null);
    dynamic_ec.nonexistentMethod();
}
class ExampleClass
{
    public ExampleClass() { }
    public ExampleClass(int v) { }

    public void exampleMethod1(int i) { }

    public void exampleMethod2(string str) { }
}

Peran pengkompilasi dalam contoh-contoh ini adalah mengemas informasi bersama tentang apa yang diusulkan setiap pernyataan untuk dilakukan pada dynamic objek atau ekspresi. Runtime memeriksa informasi yang disimpan dan pernyataan apa pun yang tidak valid menyebabkan pengecualian run-time.

Hasil dari sebagian besar operasi dinamis itu sendiri dynamic. Misalnya, jika Anda mengarahkan kursor mouse ke penggunaan testSum dalam contoh berikut, IntelliSense menampilkan jenis (variabel lokal) dinamis testSum.

dynamic d = 1;
var testSum = d + 3;
// Rest the mouse pointer over testSum in the following statement.
System.Console.WriteLine(testSum);

Operasi di mana hasilnya tidak dynamic termasuk:

  • Konversi dari dynamic ke jenis lain.
  • Panggilan konstruktor yang menyertakan argumen berjenis dynamic.

Misalnya, jenis testInstance dalam deklarasi berikut adalah ExampleClass, bukan dynamic:

var testInstance = new ExampleClass(d);

Konversi

Konversi antara objek dinamis dan jenis lainnya mudah dilakukan. Konversi memungkinkan pengembang beralih antara perilaku dinamis dan tidak dinamis.

Anda dapat mengonversi apa pun menjadi dynamic secara implisit, seperti yang ditunjukkan dalam contoh berikut.

dynamic d1 = 7;
dynamic d2 = "a string";
dynamic d3 = System.DateTime.Today;
dynamic d4 = System.Diagnostics.Process.GetProcesses();

Sebaliknya, Anda dapat menerapkan konversi implisit apa pun secara dinamis ke ekspresi jenis dynamicapa pun.

int i = d1;
string str = d2;
DateTime dt = d3;
System.Diagnostics.Process[] procs = d4;

Resolusi kelebihan beban dengan argumen jenis dinamis

Resolusi kelebihan beban terjadi saat durasi, bukan pada waktu kompilasi jika satu atau lebih argumen dalam panggilan metode memiliki jenis dynamic, atau jika penerima panggilan metode berjenis dynamic. Dalam contoh berikut, jika satu-satunya metode yang dapat diakses exampleMethod2 mengambil argumen string, mengirim d1 sebagai argumen tidak menyebabkan kesalahan kompilator, tetapi itu menyebabkan pengecualian run-time. Resolusi kelebihan beban gagal saat durasi karena jenis run-time d1 adalah int, dan exampleMethod2 memerlukan string.

// Valid.
ec.exampleMethod2("a string");

// The following statement does not cause a compiler error, even though ec is not
// dynamic. A run-time exception is raised because the run-time type of d1 is int.
ec.exampleMethod2(d1);
// The following statement does cause a compiler error.
//ec.exampleMethod2(7);

Runtime bahasa dinamis

Runtime bahasa dinamis (DLR) menyediakan infrastruktur yang mendukung dynamic jenis dalam C#, dan juga implementasi bahasa pemrograman dinamis seperti IronPython dan IronRuby. Untuk informasi selengkapnya tentang DLR, lihat Ringkasan Runtime Bahasa Dinamis.

Interop COM

Banyak metode COM memungkinkan variasi dalam jenis argumen dan jenis pengembalian dengan menetapkan jenis sebagai object. Interop COM mengharuskan pengecoran eksplisit nilai untuk berkoordinasi dengan variabel yang sangat diketik dalam C#. Jika Anda mengompilasi menggunakan opsi EmbedInteropTypes (Opsi Kompilator C#), pengenalan jenis dynamic memungkinkan Anda untuk memperlakukan kemunculan object di tanda tangan COM seolah-olah itu adalah jenis dynamic, dan dengan demikian untuk menghindari banyak transmisi. Untuk informasi selengkapnya tentang menggunakan dynamic jenis dengan objek COM, lihat artikel tentang Cara mengakses objek interop Office dengan menggunakan fitur C#.

Judul Deskripsi
dinamis Menjelaskan penggunaan kata kunci dynamic.
Ringkasan Runtime Bahasa Dinamis Memberikan ringkasan tentang DLR, yang merupakan lingkungan runtime yang menambahkan serangkaian layanan untuk bahasa dinamis ke runtime bahasa umum (CLR).
Panduan: Membuat dan Menggunakan Objek Dinamis Memberikan petunjuk langkah demi langkah untuk membuat objek dinamis kustom dan untuk membuat proyek yang mengakses pustaka IronPython.