C# 4.0 zavádí nový typ: dynamický, což je statický typ, ale objektová instance tohoto typu je schopna obejít proces statické kontroly typu. Ve většině případů typ funguje jako objektová třída. Při kompilaci instance dynamické třídy podporuje jakoukoli operaci, takže není třeba se obávat, zda je objekt převzat z COM API, nebo z dynamického jazyka jako IronPython, z HTML DOM, z reflection nebo z jiného místa v programu. Pokud však kód udělá něco neplatného, chyba je zachycena za běhu. Například příklad metody exampleMethod1 v následujícím kódovém úryvku má pouze jeden parametr a kompilátor může při kompilaci identifikovat, že je neplatný; Jedná se o chybu při kompilaci. Druhé volání dynamic_ec.exampleMethod1(10,4) není kontrolováno pro statické typy. Proto kompilátor nehlásí chyby při kompilaci. Brouk se však neskrývá navždy; Bude zachycen za běhu a spustí výjimku za běhu. static void Main(string[] args){ ExampleClass ec = new ExampleClass(); dynamic dynamic_ec = nový ExampleClass(); dynamic_ec.exampleMethod1(10, 4); 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) { }
} Tady je příklad použití dynamic pro volání IronPythonu:
pomocí IronPython.Hosting; using Microsoft.scrip{filtering}ting. Moderování;
Console.WriteLine("Načítání random.py..."); scrip{filter}tRuntime py = Python.CreateRuntime(); dynamická náhodnost = py. UseFile("random.py"); Console.WriteLine("random.py načteno!"); var položky = Enumerable.Range(1, 7). ToArray();
pro (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();
}
U objektů nebo výrazů typu dynamic je úkolem kompilátoru zapouzdřit akce, které se od každého výrazu očekává, že provedou, a při jejich vykonání zkontrolovat uložené informace, přičemž jakékoli neplatné příkazy spustí výjimku za běhu. Typ výsledku většiny dynamických operací je také dynamický. Například pokud najedete myší kurzorem na testSum v následujícím příkladu, chytrá výzva zobrazí (lokální proměnnou) dynamický testSum. dynamický d = 1; var testSum = d + 3; Najeďte myší na testSum níže. System.Console.WriteLine(testSum);
Typová konverze Přechod mezi dynamickými typovými instancemi a jinými typy instancí je jednoduchý a vývojáři mohou snadno přepínat mezi dynamickým a nedynamickým chováním. Každou instanci lze implicitně převést na instanci dynamického typu, viz následující příklad: dynamické d1 = 7; dynamické d2 = "struna"; dynamické d3 = System.DateTime.Today; dynamic d4 = System.Diagnostics.Process.GetProcesses();
Naopak implicitní převod lze dynamicky aplikovat na jakýkoli výraz typu dynamic. A naopak, jakýkoli výraz typu dynamic lze implicitně převést na jiné typy. int i = d1; struna str = d2; DateTime dt = d3; System.Diagnostics.Process[] procs = d4;
Problém přetížení s dynamickými typovými parametry v metodě Pokud je metoda volána jako objekt typu dynamic, nebo je volán objekt typu dynamic, pak se rozhodnutí o přetížení provádí za běhu a nikoli při kompilaci.
Dynamický jazyk pro běh v běhu Dynamické běhací doba jazyka je . NET Framework 4 Beta 1 je nová sada API, která podporuje dynamické typy v C# a také implementuje dynamické programovací jazyky jako IronPython a IronRuby.
Interoperabilita COM C# 4.0 obsahuje několik funkcí, které zlepšují interoperabilitu s tradičními rozhraními COM API, jako je kancelářská automatizace. Dynamické typy, pojmenované parametry a volitelné parametry jsou také součástí vylepšení. Mnoho COM metod umožňuje, aby jejich parametry a návratové hodnoty byly typově objektem, takže u silně typovaných jazyků, jako je C#, je potřeba hodně nucené konverze typů. Nicméně v C# 4.0, pokud přidáte možnost /link při kompilaci, dynamický typ má nový efekt: označuje typ objektu (parametr nebo návrat) v podpisu metody COM rozhraní za dynamický, čímž se vyhne mnoha převodům typů. Například následující tvrzení to kontrastuje. Nepoužívá se dynamicky. ((Excel.Range)excel. Buňky[1, 1]). Value2 = "Jméno"; Excel.Range range = (Excel.Range)excel. Buňky[1, 1];
Byla dynamická. Excel. Buňky[1, 1]. Hodnota = "Jméno"; Excel.Range range range = excel. Buňky[1, 1]; |