C# 4.0 pristato naują tipą: dinaminį, kuris yra statinis tipas, tačiau tokio tipo objekto egzempliorius gali apeiti statinio tipo tikrinimo procesą. Daugeliu atvejų tipas veikia kaip objektų klasė. Kompiliavimo metu dinaminės klasės egzempliorius palaiko bet kokią operaciją, todėl nereikia jaudintis, ar objektas paimtas iš COM API, ar dinaminės kalbos, pvz., IronPython, iš HTML DOM, ar iš atspindžio, ar kur nors kitur programoje. Tačiau jei kodas daro ką nors netinkamo, klaida užfiksuojama vykdymo metu. Pavyzdžiui, pavyzdinis metodas exampleMethod1 šiame kodo fragmente turi tik vieną parametrą, o kompiliatorius gali nustatyti, kad jis netinkamas, kai kompiliavimo metu iškviečia ec.exampleMethod1(10,4); Tai kompiliavimo klaida. Antrasis iškvietimas dynamic_ec.exampleMethod1(10,4) netikrinamas dėl statinių tipų. Todėl kompiliatorius nepraneša apie kompiliavimo klaidas. Tačiau klaida neslepia amžinai; Jis bus užfiksuotas vykdymo metu ir suaktyvins vykdymo laiko išimtį. static void Main(string[] args){ ExampleClass ec = naujas ExampleClass(); dinaminis dynamic_ec = naujas ExampleClass(); dynamic_ec.pavyzdys1 metodas(10, 4); dynamic_ec.someMethod("kažkoks argumentas", 7, nulinis); dynamic_ec.nonexistentMethod();
} klasė ExampleClass { public ExampleClass() { } public ExampleClass(int v) { } public void exampleMethod1(int i) { } public void exampleMethod2(string str) { }
} Štai dinaminio naudojimo IronPython iškvietimui pavyzdys:
naudojant IronPython.Hosting; naudojant Microsoft.scrip{filtering}ting. Priegloba;
Console.WriteLine("Įkeliama random.py..."); scrip{filter}tRuntime py = Python.CreateRuntime(); dinaminis atsitiktinis = py. UseFile("random.py"); Console.WriteLine("random.py įkelta!"); var elementai = Enumerable.Range(1, 7). ToArray();
for (int s = 0; s < 10000; s++) { random.shuffle(elementai); Console.Write("Seka {0}: ", s); foreach (int i prekėse) { Console.Write("{0} ", i); } Console.WriteLine();
}
Dinaminio tipo objektams ar išraiškoms kompiliatoriaus vaidmuo yra inkapsuliuoti veiksmus, kuriuos tikimasi atlikti kiekvienoje išraiškoje, ir vykdymo metu patikrinti saugomą informaciją, o bet kokie netinkami sakiniai suaktyvins vykdymo laiko išimtį. Daugumos dinaminių operacijų rezultato tipas taip pat yra dinamiškas. Pavyzdžiui, jei toliau pateiktame pavyzdyje užveskite pelės žymeklį virš testSum, išmanusis raginimas parodys (vietinį kintamąjį) dinaminį testSum. dinaminis d = 1; var testSum = d + 3; Užveskite pelės žymeklį virš žemiau esančios testSum. System.Console.WriteLine(testSum);
Tipo konvertavimas Perėjimas tarp dinaminio tipo egzempliorių ir kitų tipų egzempliorių yra paprastas, o kūrėjai gali lengvai perjungti dinaminį ir nedinaminį elgesį. Bet kurį egzempliorių galima netiesiogiai konvertuoti į dinaminio tipo egzempliorių, žr. šį pavyzdį: dinaminis d1 = 7; dinaminis d2 = "eilutė"; dinaminis d3 = System.DateTime.Today; dinaminis d4 = System.Diagnostics.Process.GetProcesses();
Ir atvirkščiai, numanoma konversija gali būti dinamiškai taikoma bet kuriai dinaminio tipo išraiškai. Ir atvirkščiai, bet kokia dinaminio tipo išraiška taip pat gali būti netiesiogiai konvertuojama į kitus tipus. int i = d1; eilutė str = d2; DateTime dt = d3; System.Diagnostics.Process[] procs = d4;
Perkrovos problema su dinaminio tipo parametrais metode Jei metodas vadinamas praeina dinaminio tipo objektą arba iškviečiamas objektas yra dinaminio tipo, tada perkrovos sprendimas įvyksta vykdymo metu, o ne kompiliavimo metu.
Dinaminės kalbos vykdymo DLR Dinaminės kalbos vykdymo laikas yra . NET Framework 4 Beta 1 yra naujas API rinkinys, kuris palaiko dinaminius tipus C# ir taip pat įgyvendina dinamines programavimo kalbas, tokias kaip IronPython ir IronRuby.
COM sąveika C# 4.0 apima keletą funkcijų, kurios pagerina sąveikumą su tradicinėmis COM API sąsajomis, tokiomis kaip "Office" automatizavimas. Dinaminiai tipai, pavadinti parametrai ir pasirenkami parametrai taip pat yra patobulinimo dalis. Daugelis COM metodų leidžia savo parametrus ir grąžinamas reikšmes būti objekto tipo, todėl stipriai įvestoms kalboms, tokioms kaip C#, reikia daug priverstinio tipo konvertavimo. Tačiau C# 4.0, jei kompiliavimo metu pridėsite parinktį /link, dinaminis tipas turi naują efektą: objekto tipas (parametro tipas arba grąžinimo tipas) COM sąsajos metodo paraše laikomas dinaminiu, taip išvengiant daug tipo konvertavimo. Pavyzdžiui, šis teiginys tai prieštarauja. Jis nenaudojamas dinaminis. ((Excel.Range)Excel. Ląstelės[1, 1]). Value2 = "Vardas"; Excel.Range diapazonas = (Excel.Range)excel. Ląstelės[1, 1];
Tai buvo dinamiška. Tobulėti. Ląstelės[1, 1]. Value = "Vardas"; Excel.Range diapazonas = excel. Ląstelės[1, 1]; |