C# 4.0 führt einen neuen Typ ein: dynamisch, der ein statischer Typ ist, aber eine Objektinstanz dieses Typs kann den statischen Typprüfprozess umgehen. In den meisten Fällen funktioniert der Typ wie eine Objektklasse. Zur Kompilierungszeit unterstützt eine Instanz einer dynamischen Klasse jede Operation, sodass es keine Sorgen machen muss, ob das Objekt aus einer COM-API, einer dynamischen Sprache wie IronPython, aus dem HTML-DOM, aus der Reflexion oder an einem anderen Ort im Programm stammt. Wenn der Code jedoch etwas Ungültiges macht, wird der Fehler zur Laufzeit erkannt. Zum Beispiel hat die Beispielmethode exampleMethod1 im folgenden Codeausschnitt nur einen Parameter, und der Compiler kann erkennen, dass dieser ungültig ist, wenn er ec.exampleMethod1(10,4) zur Kompilierungszeit aufruft; Dies ist ein Kompilierungsfehler. Der zweite Aufruf dynamic_ec.exampleMethod1(10,4) wird nicht für statische Typen überprüft. Daher meldet der Compiler keine Kompilierungsfehler. Der Käfer versteckt sich jedoch nicht für immer; Er wird zur Laufzeit erkannt und löst eine Laufzeit-Ausnahme aus. statische Void Main(string[] args){ ExampleClass ec = neuer ExampleClass(); dynamic dynamic_ec = neue ExampleClass(); dynamic_ec.exampleMethod1(10, 4); dynamic_ec.someMethod("some argument", 7, null); dynamic_ec.nonexistentMethod();
} Klasse ExampleClass { public ExampleClass() { } public ExampleClass(int v) { } public void exampleMethod1(int i) { } public void exampleMethod2(string str) { }
} Hier ist ein Beispiel für die Verwendung von dynamisch, um IronPython aufzurufen:
mit IronPython.Hosting; mit Microsoft.scrip{filtering}ting. Gastgeber;
Console.WriteLine("Laden random.py..."); scrip{filter}tRuntime py = Python.CreateRuntime(); dynamisch zufällig = Py. UseFile("random.py"); Console.WriteLine("random.py geladen!"); var Items = Enumerable.Range(1, 7). ToArray();
für (int s = 0; s < 10.000; s++) { random.shuffle(items); Console.Write("Sequence {0}: ", s); foreach (int i in items) { Console.Write("{0} ", i); } Console.WriteLine();
}
Für Objekte oder Ausdrücke mit dynamischem Typ besteht die Aufgabe des Compilers darin, die Aktionen zu kapseln, die jeder Ausdruck ausführen soll, und zum Zeitpunkt der Ausführung die gespeicherten Informationen zu überprüfen; alle ungültigen Anweisungen lösen eine Laufzeitausnahme aus. Die Art des Ergebnisses der meisten dynamischen Operationen ist ebenfalls dynamisch. Wenn du zum Beispiel mit deinem Mauszeiger im folgenden Beispiel über das testSum fährst, zeigt der smarte Prompt eine (lokale Variable) dynamische testSumme an. dynamisch d = 1; var testSum = d + 3; Fahre mit der Mauszeiger über das untenstehende TestSum. System.Console.WriteLine(testSum);
Typumbau Der Übergang zwischen dynamischen Instanzen und anderen Instanztypen ist einfach, und Entwickler können problemlos zwischen dynamischen und undynamischen Verhaltensweisen wechseln. Jede Instanz kann implizit in eine dynamische Instanz umgewandelt werden, siehe folgendes Beispiel: dynamisch d1 = 7; dynamisch d2 = "eine Saite"; dynamisch d3 = System.DateTime.Today; dynamisch d4 = System.Diagnostik.Prozess.GetProcesses();
Umgekehrt kann eine implizite Umwandlung dynamisch auf jeden Ausdruck des Typs dynamisch angewendet werden. Und umgekehrt kann jeder Ausdruck des Typs dynamisch auch implizit in andere Typen umgewandelt werden. int i = d1; String str = d2; DateTime dt = d3; System.Diagnostics.Process[] procs = d4;
Überlastungsproblem mit dynamischen Typparametern in der Methode Wenn eine Methode ein Objekt vom Typ dynamisch passiert oder das aufgerufene Objekt vom Typ dynamisch ist, erfolgt die Bewertung der Überlastung zur Laufzeit und nicht zur Kompilierungszeit.
Dynamische Sprachlaufzeit-DLR Die dynamische Sprachlaufzeit ist . NET Framework 4 Beta 1 ist eine neue Reihe von APIs, die dynamische Typen in C# unterstützen und zudem dynamische Programmiersprachen wie IronPython und IronRuby implementieren.
COM-Interoperabilität C# 4.0 enthält mehrere Funktionen, die die Interoperabilität mit traditionellen COM-API-Schnittstellen wie Office-Automatisierung verbessern. Dynamische Typen, benannte Parameter und optionale Parameter sind ebenfalls Teil der Verbesserung. Viele COM-Methoden erlauben es, dass ihre Parameter und Rückgabewerte vom Typobjekt sind, sodass für stark typisierte Sprachen wie C# eine große erzwungene Typumwandlung erforderlich ist. In C# 4.0 jedoch, wenn man zur Kompilierungszeit die /link-Option hinzufügt, hat der dynamische Typ einen neuen Effekt: Er macht den Objekttyp (Parametertyp oder Rückgabetyp) in der COM-Interface-Methodensignatur als dynamisch, wodurch viel Typkonvertierung vermeidet wird. Zum Beispiel steht die folgende Aussage dem gegenüber. Es wird nicht dynamisch verwendet. ((Excel.Range)excel. Zellen[1, 1]). Value2 = "Name"; Excel.Range range = (Excel.Range)excel. Zellen[1, 1];
Es war ein dynamisches. Excel. Zellen[1, 1]. Wert = "Name"; Excel. Bereichsbereich = Excel. Zellen[1, 1]; |