C# 4.0 вводит новый тип: dynamic, который является статическим, но объектный экземпляр этого типа может обойти процесс проверки статического типа. В большинстве случаев тип работает как класс объекта. Во время компиляции экземпляр динамического класса поддерживает любую операцию, поэтому нет необходимости беспокоиться о том, взят ли объект из COM-API, динамического языка вроде IronPython, из HTML DOM, из отражения или из другого места в программе. Однако если код делает что-то недействительное, ошибка фиксируется во время выполнения. Например, пример метода exampleMethod1 в следующем фрагменте кода содержит только один параметр, и компилятор может определить, что он невалиден при вызове ec.exampleMethod1(10,4) во время компиляции; Это ошибка компиляции. Второй вызов dynamic_ec.exampleMethod1(10,4) не проверяется на статические типы. Поэтому компилятор не сообщает об ошибках компиляции. Однако жучок не скрывается вечно; Он будет зафиксирован во время выполнения и сработает исключение во время выполнения. static void Main(string[] args){ ExampleClass ec = новый ExampleClass(); динамический dynamic_ec = новый ExampleClass(); dynamic_ec.exampleMethod1(10, 4); dynamic_ec.someMethod («некоторые аргументы», 7, null); dynamic_ec.nonexistentMethod();
} class ExampleClass { public ExampleClass() { } public ExampleClass(int v) { } public void exampleMethod1(int i) { } public void exampleMethod2(string str) { }
} Вот пример использования динамического режима для вызова IronPython:
с использованием IronPython.Hosting; используя Microsoft.scrip{filtering}ting. Ведущее;
Console.WriteLine («Загрузка random.py...»); scrip{filter}tRuntime py = Python.CreateRuntime(); динамический случайный = py. UseFile("random.py"); Console.WriteLine("random.py loaded!"); var items = Elistable.Range (1, 7). ToArray();
для (int s = 0; s < 10000; s++) { random.shuffle(items); Console.Write("Sequence {0}: ", s); foreach (int i in items) { Console.Write("{0} ", i); } Console.WriteLine();
}
Для объектов или выражений динамического типа задача компилятора — инкапсулировать действия, которые каждое выражение должно выполнять, и при выполнении проверять сохранённую информацию, при этом любые некорректные операторы вызывают исключение во время выполнения. Тип результата большинства динамических операций также является динамичным. Например, если наводить курсор мыши на testSum в следующем примере, умный запрос покажет (локальную переменную) динамическую testSum. динамическое d = 1; var testСумма = d + 3; Наведите курсор мыши на testSum ниже. System.Console.WriteLine(testSum);
Преобразование типов Переход между инстансами динамического типа и другими типами инстансов прост, и разработчики могут легко переключаться между динамичным и нединамическим поведением. Любой экземпляр можно неявно преобразовать в динамический тип, см. следующий пример: динамический d1 = 7; динамический d2 = «строка»; динамический d3 = System.DateTime.Today; динамический d4 = System.Diagnostics.Process.GetProcesses();
Наоборот, неявное преобразование может динамически применяться к любому выражению с динамикой типа. И наоборот, любое выражение типовой динамики также может быть неявно преобразовано в другие типы. int i = d1; строка str = d2; DateTime dt = d3; System.Diagnostics.Process[] procs = d4;
Проблема перегрузки с параметрами динамического типа в методе Если метод называется проходящим объект динамического типа, или вызываемый объект динамического типа, то оценка перегрузки происходит во время выполнения, а не во время компиляции.
Динамический языковой DLR во время выполнения Динамическое время выполнения языка — это . NET Framework 4 Beta 1 — это новый набор API, которые поддерживают динамические типы в C#, а также реализуют динамические языки программирования, такие как IronPython и IronRuby.
Совместимость COM C# 4.0 включает несколько функций, улучшающих совместимость с традиционными интерфейсами COM API, такими как автоматизация Office. Динамические типы, именованные параметры и необязательные параметры также входят в улучшение. Многие методы COM позволяют своим параметрам и возвращаемым значениям быть объектом типа, поэтому для сильно типизированных языков, таких как C#, требуется много принудительного преобразования типа. Однако в C# 4.0, если добавить опцию /link во время компиляции, динамический тип приобретает новый эффект: он делает тип объекта (тип параметра или тип возврата) в методе интерфейса COM считается динамическим, что позволяет избежать значительного преобразования типов. Например, следующее утверждение противоречит этому. Она не используется динамично. ((Excel.Range)excel. Клетки[1, 1]). Value2 = «Имя»; Excel.Диапазон = (Excel.Диапазон)Excel. Клетки[1, 1];
Это было динамично. Excel. Клетки[1, 1]. Value = «Имя»; Excel. Диапазон диапазона = Excel. Клетки[1, 1]; |