C# 4.0 uvaja nov tip: dinamični, ki je statični tip, vendar lahko objektna instanca tega tipa obide postopek statične tipske kontrole. V večini primerov tip deluje kot objektni razred. Ob prevajanju instanca dinamičnega razreda podpira katerokoli operacijo, zato ni treba skrbeti, ali je objekt vzet iz COM API-ja, dinamičnega jezika, kot je IronPython, iz HTML DOM, iz reflectiona ali od nekje drugje v programu. Če pa koda naredi nekaj neveljavnega, se napaka zazna med izvajanjem. Na primer, primer metode exampleMethod1 v naslednjem kodnem izseku ima le en parameter, prevajalnik pa lahko prepozna, da je neveljaven, ko ob prevajanju kliče ec.exampleMethod1(10,4); To je napaka pri prevajanju. Drugi klic dynamic_ec.exampleMethod1(10,4) ni preverjen za statične tipe. Zato prevajalnik ne poroča o napakah pri prevajanju. Vendar pa hrošč ne skriva večno; Ujeta bo med izvajanjem in sproži izjemo v času izvajanja. static void Main(string[] args){ ExampleClass ec = novi ExampleClass(); dynamic dynamic_ec = nov ExampleClass(); dynamic_ec.exampleMethod1(10, 4); dynamic_ec.someMethod("nek argument", 7, null); dynamic_ec.nonexistentMethod();
} class ExampleClass { public ExampleClass() { } javni ExampleClass(int v) { } public void exampleMethod1(int i) { } public void exampleMethod2(string str) { }
} Tukaj je primer uporabe dynamic za klic IronPythona:
z uporabo IronPython.Hosting; using Microsoft.scrip{filtering}ting. Gostiteljstvo;
Console.WriteLine("Nalaganje random.py..."); scrip{filter}tRuntime py = Python.CreateRuntime(); dinamično naključno = py. UseFile("random.py"); Console.WriteLine("random.py naloženo!"); var elementi = Enumerable.Range(1, 7). ToArray();
za (int s = 0; s < 10000; s++) { random.shuffle(items); Console.Write("Sequence {0}: ", s); foreach (int i v predmetih) { Console.Write("{0} ", i); } Console.WriteLine();
}
Za objekte ali izraze tipa dinamično je naloga prevajalnika zajeti dejanja, ki jih naj bi vsak izraz izvedel, in ob izvedbi preveriti shranjene informacije, pri čemer bodo neveljavni stavki sprožili izjemo med izvajanjem. Vrsta rezultata večine dinamičnih operacij je prav tako dinamična. Na primer, če z miško premaknete kazalec nad testSum v naslednjem primeru, bo pametni poziv prikazal (lokalno spremenljivko) dynamicSum. dinamični d = 1; var testSum = d + 3; Z miško zastavite kazalec nad testSum spodaj. System.Console.WriteLine(testSum);
Predelava tipa Prehod med dinamičnimi in drugimi vrstami primerkov je preprost, razvijalci pa lahko enostavno preklapljajo med dinamičnimi in nedinamičnimi vedenji. Vsak primer je mogoče implicitno pretvoriti v primer dinamičnega tipa, glej naslednji primer: dinamični d1 = 7; dinamični d2 = "niz"; dinamični d3 = System.DateTime.Today; dynamic d4 = System.Diagnostics.Process.GetProcesses();
Nasprotno pa se implicitna pretvorba lahko dinamično uporabi na katerikoli izraz dinamičnega tipa. In obratno, vsak izraz tipa dinamično je mogoče implicitno pretvoriti v druge tipe. int i = d1; niz str = d2; DateTime dt = d3; System.Diagnostics.Process[] procs = d4;
Problem preobremenitve z dinamičnimi tipnimi parametri v metodi Če je metoda poklicana kot predmet tipa dinamični ali če je klicani objekt tipa dinamični, se presoja preobremenitve zgodi med izvajanjem in ne med prevajanjem.
Dinamični jezikovni izvajalni DLR Dinamični čas izvajanja jezika je . NET Framework 4 Beta 1 je nov nabor API-jev, ki podpirajo dinamične tipe v C# in prav tako implementirajo dinamične programske jezike, kot sta IronPython in IronRuby.
Interoperabilnost COM C# 4.0 vključuje več funkcij, ki izboljšujejo interoperabilnost s tradicionalnimi COM API vmesniki, kot je pisarniška avtomatizacija. Dinamični tipi, imenovani parametri in neobvezni parametri so prav tako del izboljšav. Veliko COM metod dovoljuje, da so njihovi parametri in povratne vrednosti tipični objekti, zato je za močno tipizirane jezike, kot je C#, potrebno veliko prisilne pretvorbe tipov. Vendar pa ima v C# 4.0, če ob prevajanju dodate možnost /link, dinamični tip nov učinek: označi objektni tip (parameter tip ali return tip) v podpisu COM vmesne metode kot dinamičen, s čimer se izogne veliko pretvorbe tipov. Na primer, naslednja izjava to primerja. Ne uporablja se dinamično. ((Excel.Range)excel. Celice[1, 1]). Vrednost2 = "Ime"; Excel.Range range = (Excel.Range)excel. Celice[1, 1];
Bil je dinamičen. EXCEL. Celice[1, 1]. Vrednost = "Ime"; Excel.Range range = excel. Celice[1, 1]; |