C# 4.0 wprowadza nowy typ: dynamiczny, który jest typem statycznym, ale instancja obiektu tego typu jest w stanie ominąć proces statycznego sprawdzania typów. W większości przypadków typ działa jak klasa obiektu. W czasie kompilacji instancja klasy dynamicznej obsługuje dowolną operację, więc nie trzeba się martwić, czy obiekt pochodzi z API COM, języka dynamicznego takiego jak IronPython, z HTML DOM, z reflection lub innego miejsca w programie. Jednak jeśli kod robi coś nieprawidłowego, błąd jest wykrywany w czasie działania. Na przykład przykładowa metoda exampleMethod1 w następującym fragmencie kodu ma tylko jeden parametr, a kompilator może zidentyfikować jego nieprawidłowość podczas wywoływania ec.exampleMethod1(10,4) podczas kompilacji; To jest błąd kompilacji. Drugie wywołanie dynamic_ec.exampleMethod1(10,4) nie jest sprawdzane pod kątem typów statycznych. Dlatego kompilator nie zgłasza błędów kompilacji. Jednak robak nie ukrywa się wiecznie; Zostanie wychwycony w czasie działania i wywoła wyjątek w czasie wykonywania. static void Main(string[] args){ ExampleClass ec = new ExampleClass(); dynamic dynamic_ec = nowa 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) { }
} Oto przykład użycia dynamic do wywołania IronPythona:
używając IronPython.Hosting; using Microsoft.scrip{filtering}ting. Prowadzenie;
Console.WriteLine("Ładowanie random.py..."); scrip{filter}tRuntime py = Python.CreateRuntime(); Losowość dynamiczna = py. UseFile("random.py"); Console.WriteLine("random.py załadowana!"); var items = Enumerable.Range(1, 7). ToArray();
dla (int s = 0; s < 10000; s++) { random.shuffle(items); Console.write("Sequence {0}: ", s); foreach (int i w przedmiotach) { Console.Write("{0} ", i); } Console.WriteLine();
}
Dla obiektów lub wyrażeń o dynamice typów rolą kompilatora jest enkapsulowanie działań, które każde wyrażenie ma wykonać, a w momencie wykonania sprawdzenie przechowywanych informacji, a wszelkie nieprawidłowe instrukcje wywołają wyjątek w czasie wykonywania. Typ wyniku większości operacji dynamicznych jest również dynamiczny. Na przykład, jeśli najedziesz kursorem myszy na testSum w poniższym przykładzie, inteligentny komunikat wyświetli (zmienną lokalną) testSum dynamiczną. dynamiczny d = 1; var testSum = d + 3; Najedź kursorem myszy nad testSum poniżej. System.Console.WriteLine(testSum);
Konwersja typu Przejście między instancjami typu dynamicznego a innymi typami jest proste, a deweloperzy mogą łatwo przełączać się między zachowaniami dynamicznymi a niedynamicznymi. Każdą instancję można domyślnie przekształcić w instancję typu dynamicznego, zobacz następujący przykład: dynamiczne d1 = 7; dynamiczny d2 = "struna"; dynamiczne d3 = System.DateTime.Today; dynamic d4 = System.Diagnostics.Process.GetProcesses();
Natomiast konwersja niejawna może być dynamicznie stosowana do dowolnego wyrażenia dynamicznego typu. I odwrotnie, każde wyrażenie dynamicznego typu może być również niejawnie przekształcone w inne typy. int i = d1; strumień str = d2; DateTime dt = d3; System.Diagnostics.Process[] procs = d4;
Problem przeciążenia z parametrami typu dynamicznego w metodzie Jeśli metoda jest wywoływana jako obiekt o dynamicznym typie lub obiekt wywoływany jest dynamiczny typu dynamic, to ocena przeciążenia następuje w czasie działania, a nie w czasie kompilacji.
Dynamiczny język DLR w czasie rzeczywistym Dynamiczne środowisko wykonawcze języka to . NET Framework 4 Beta 1 to nowy zestaw API wspierających typy dynamiczne w C# oraz implementujących języki programowania dynamicznego, takich jak IronPython i IronRuby.
Interoperacyjność COM C# 4.0 zawiera kilka funkcji poprawiających interoperacyjność z tradycyjnymi interfejsami COM API, takimi jak automatyzacja Office. Elementy ulepszenia są także typy dynamiczne, parametry nazwane oraz parametry opcjonalne. Wiele metod COM pozwala, aby ich parametry i wartości zwrotne były obiektem typu, więc w językach silnie typowanych, takich jak C#, wymagana jest duża konwersja typów. Jednak w C# 4.0, jeśli dodasz opcję /link podczas kompilacji, typ dynamiczny ma nowy efekt: sprawia, że typ obiektu (typ parametru lub typ return) w sygnaturze metody interfejsu COM jest traktowany jako dynamiczny, co pozwala uniknąć wielu konwersji typów. Na przykład następujące stwierdzenie to kontrastuje. Nie jest używany dynamicznie. ((Excel.Range)excel. Komórki[1, 1]). Value2 = "Imię"; Excel.Zakres = (Excel.Zakres)excel. Komórki[1, 1];
To była dynamiczna relacja. Excel. Komórki[1, 1]. Wartość = "Imię"; Excel. Zakres = excel. Komórki[1, 1]; |