C# 4.0 zavádza nový typ: dynamický, čo je statický typ, ale inštancia objektu tohto typu dokáže obísť proces kontroly statického typu. Vo väčšine prípadov typ funguje ako objektová trieda. Pri kompilácii inštancia dynamickej triedy podporuje akúkoľvek operáciu, takže nie je potrebné sa obávať, či je objekt prevzatý z COM API, alebo z dynamického jazyka ako IronPython, z HTML DOM, z reflectionu alebo odniekiaľ inde v programe. Ak však kód urobí niečo neplatné, chyba sa zachytí počas behu. Napríklad príklad metódy exampleMethod1 v nasledujúcom kódovom úryvku má len jeden parameter a kompilátor dokáže identifikovať, že je neplatný pri volaní ec.exampleMethod1(10,4) pri kompilácii; Ide o chybu pri kompilácii. Druhé volanie dynamic_ec.exampleMethod1(10,4) nie je kontrolované pre statické typy. Preto kompilátor nehlási chyby pri kompilácii. Avšak chrobák sa neskrýva navždy; Bude zachytený počas behu a spustí výnimku za behu. static void Main(string[] args){ ExampleClass ec = new ExampleClass(); dynamic dynamic_ec = nový ExampleClass(); dynamic_ec.exampleMethod1(10, 4); dynamic_ec.someMethod("nejaký argument", 7, null); dynamic_ec.nonexistentMethod();
} class ExampleClass { public ExampleClass() { } public ExampleClass(int v) { } public void exampleMethod1(int i) { } public void exampleMethod2(string str) { }
} Tu je príklad použitia dynamic na volanie IronPythonu:
pomocou IronPython.Hosting; using Microsoft.scrip{filtering}ting. Moderovanie;
Console.WriteLine("Loading random.py..."); scrip{filter}tRuntime py = Python.CreateRuntime(); dynamická náhodnosť = py. UseFile("random.py"); Console.WriteLine("random.py načítaný!"); var položky = Enumerable.Range(1, 7). ToArray();
pre (int s = 0; s < 10000; s++) { random.shuffle(items); Console.Write("Sequence {0}: ", s); foreach (int i v položkách) { Console.Write("{0} ", i); } Console.WriteLine();
}
Pre objekty alebo výrazy typu dynamic je úlohou kompilátora zapuzdriť akcie, ktoré sa očakávajú, že každý výraz vykoná, a pri ich vykonaní skontrolovať uložené informácie, pričom akékoľvek neplatné príkazy spustia výnimku za behu. Typ výsledku väčšiny dynamických operácií je tiež dynamický. Napríklad, ak prejdete kurzorom myši nad testSum v nasledujúcom príklade, smart prompt zobrazí (lokálnu premennú) dynamický testSum. dynamický d = 1; var testSum = d + 3; Podržte kurzor myši nad testSum nižšie. System.Console.WriteLine(testSum);
Typová konverzia Prechod medzi inštanciami dynamických typov a inými typmi inštancií je jednoduchý a vývojári môžu jednoducho prepínať medzi dynamickým a nedynamickým správaním. Každú inštanciu možno implicitne previesť na inštanciu dynamického typu, pozri nasledujúci príklad: dynamický d1 = 7; dynamický d2 = "reťazec"; dynamický d3 = System.DateTime.Today; dynamic d4 = System.Diagnostics.Process.GetProcesses();
Naopak, implicitná konverzia môže byť dynamicky aplikovaná na akýkoľvek výraz typovej dynamiky. A naopak, akýkoľvek výraz typu dynamický môže byť implicitne prevedený na iné typy. int i = d1; reťazec str = d2; DátumČas dt = d3; System.Diagnostics.Process[] procs = d4;
Problém preťaženia s dynamickými typovými parametrami v metóde Ak je metóda volaná ako objekt typu dynamic alebo objekt, ktorý je volaný, je typu dynamic, potom sa hodnotenie preťaženia vykonáva počas behu, nie pri kompilácii.
Dynamický jazykový runtime DLR Dynamický jazykový runtime je . NET Framework 4 Beta 1 je nová sada API, ktoré poskytujú podporu dynamických typov v C# a zároveň implementujú dynamické programovacie jazyky ako IronPython a IronRuby.
Interoperabilita COM C# 4.0 obsahuje niekoľko funkcií, ktoré zlepšujú interoperabilitu s tradičnými rozhraniami COM API, ako je kancelárska automatizácia. Dynamické typy, pomenované parametre a voliteľné parametre sú tiež súčasťou zlepšenia. Mnohé metódy COM umožňujú svoje parametre a návratové hodnoty byť typovým objektom, takže pre silne typované jazyky ako C# je potrebná veľká nútená konverzia typov. Avšak v C# 4.0, ak pridáte možnosť /link pri kompilácii, dynamický typ má nový efekt: robí objektový typ (parameter type alebo return type) v podpise COM rozhrania považovaný za dynamický, čím sa vyhýba veľkej konverzii typu. Napríklad nasledujúce tvrdenie to kontrastuje. Nepoužíva sa dynamicky. ((Excel.Range)excel. Bunky[1, 1]). Value2 = "Meno"; Excel.Range range = (Excel.Range)excel. Bunky[1, 1];
Bol dynamický. Excel. Bunky[1, 1]. Hodnota = "Meno"; Excel.Range range = excel. Bunky[1, 1]; |