Тази статия е огледална статия за машинен превод, моля, кликнете тук, за да преминете към оригиналната статия.

Изглед: 18548|Отговор: 0

[Източник] Използване на динамика в C# 4.0

[Копирай линк]
Публикувано в 7.07.2016 г. 10:23:00 ч. | | |
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];




Предишен:MVC AJAX. Страницата BeginForm() се подава асинхронно
Следващ:друг обект със същата стойност на идентификатора вече беше свързан с...
Отричане:
Целият софтуер, програмни материали или статии, публикувани от Code Farmer Network, са само за учебни и изследователски цели; Горното съдържание не трябва да се използва за търговски или незаконни цели, в противен случай потребителите ще понесат всички последствия. Информацията на този сайт идва от интернет, а споровете за авторски права нямат нищо общо с този сайт. Трябва напълно да изтриете горното съдържание от компютъра си в рамките на 24 часа след изтеглянето. Ако ви харесва програмата, моля, подкрепете оригинален софтуер, купете регистрация и получете по-добри услуги. Ако има нарушение, моля, свържете се с нас по имейл.

Mail To:help@itsvse.com