C# 4.0 въвежда нов тип: dynamic, който е статичен тип, но обектна екземпляр от този тип може да заобиколи процеса на проверка на статичен тип. В повечето случаи типът работи като клас на обекти. По време на компилация инстанция на динамичен клас поддържа всяка операция, така че няма нужда да се притеснявате дали обектът е взет от COM API, динамичен език като IronPython, от HTML DOM, от reflection или от друго място в програмата. Въпреки това, ако кодът направи нещо невалидно, грешката се улавя по време на изпълнение. Например, примерният метод 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() { } 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 елементи = Изброимо. Обхват(1, 7). ToArray();
за (int s = 0; s < 10000; s++) { random.shuffle(елементи); Console.Write("Sequence {0}: ", s); foreach (int i in items) { Console.Write("{0} ", i); } Console.WriteLine();
}
За обекти или изрази с динамичен тип ролята на компилатора е да капсулира действията, които всяко изражение се очаква да извърши, и в момента на изпълнение да проверява съхранената информация, като всяко невалидно изявление ще предизвика изключение по време на изпълнение. Типът резултат от повечето динамични операции също е динамичен. Например, ако задържите курсора си върху testSum в следния пример, smart prompt ще покаже (локална променлива) динамична 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 интерфейси, като автоматизация на офиса. Динамични типове, именувани параметри и опционални параметри също са част от подобрението. Много COM методи позволяват техните параметри и връщащи стойности да бъдат тип обект, така че за силно типизирани езици като C# е необходима много принудителна конверсия на типове. Въпреки това, в C# 4.0, ако добавите опцията /link по време на компилация, динамичният тип има нов ефект: той прави типа на обекта (тип параметър или тип return) в COM интерфейсния метод подпис за динамичен, като по този начин се избягва много преобразуване на типове. Например, следното твърдение противопоставя това. Не се използва динамично. ((Excel.Range)excel. Клетки[1, 1]). Стойност2 = "Име"; Excel.Обхват = (Excel.Обхват)excel. Клетки[1, 1];
Беше динамично. Excel. Клетки[1, 1]. Стойност = "Име"; Excel. Обхват = excel. Клетки[1, 1]; |