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();
} клас ExampleClass { публічний 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 завантажено!"); var items = Enumerable.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 testSum = d + 3; Наведіть курсор миші на testSum нижче. System.Console.WriteLine(testSum);
Перетворення типу Перехід між екземплярами динамічного типу та іншими типами інстансів простий, і розробники можуть легко перемикатися між динамичною та нединамічною поведінкою. Будь-який екземпляр можна неявно перетворити на екземпляр динамічного типу, див. наступний приклад: динамічний d1 = 7; динамічний d2 = «рядок»; динамічний d3 = System.DateTime.Today; dynamic 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]; |