C# Desktop. Занятие 14

Preview:

Citation preview

Темы лекции: Динамические типы.

Практическое задание: Динамические типы.

Тренер: Игорь Шкулипа, к.т.н.

Платформа .Net и язык программирования C#.

Занятие 14

http://www.slideshare.net/IgorShkulipa 2

Тип dynamicТип dynamic позволяет пропускать проверки типов во время компиляции операции,

в которых он применяется . Вместо этого эти операции разрешаются во времявыполнения. Тип dynamic упрощает доступ к API модели COM, например APIавтоматизации Office, к динамическим API, например библиотекам IronPython, имодели DOM HTML.

В большинстве случаев тип dynamic ведет себя так же, как object. Однакооперации, которые содержат выражения типа dynamic, не разрешаются, иливыполняется проверка типа компилятором. Компилятор пакует сведения обоперации, затем эти сведения используются для оценки операции во времявыполнения. Как часть процесса, переменные типа dynamic компилируются впеременные типа object. Поэтому тип dynamic существует только во времякомпиляции, но не во время выполнения.

class Program {

static void Main(string[] args) {

dynamic dyn = 1;

object obj = 1;

System.Console.WriteLine(dyn.GetType());

System.Console.WriteLine(obj.GetType());

}

}System.Int32

System.Int32

http://www.slideshare.net/IgorShkulipa 3

Разница между object и dynamic

Чтобы понять различие между dyn и obj во время компиляции, можнодобавить следующие две строки между объявлениями и операторамиWriteLine в предыдущем примере.

dyn = dyn + 3;

obj = obj + 3;

• При попытке добавления целого числа или объекта в выражениеobj + 3 выводится ошибка компиляции.

• А для dyn + 3 нет сообщений об ошибках .

Выражение, содержащее dyn, не проверяется во время компиляции,поскольку тип dyn задан как dynamic.

http://www.slideshare.net/IgorShkulipa 4

Использование dynamic

В объявлениях в качестве типа свойства, поля, индексатор, параметра,возвращаемого значения, локальной переменной или ограничения типа.

class ExampleClass

{

static dynamic field;

dynamic prop { get; set; }

public dynamic exampleMethod(dynamic d)

{

dynamic local = "Local variable";

int two = 2;

if (d is int)

{

return local;

}

else

{

return two;

}

}

}

http://www.slideshare.net/IgorShkulipa 5

Использование dynamic

В преобразованиях явного типа в качестве типа целевого объекта преобразования.

static void convertToDynamic()

{

dynamic d;

int i = 20;

d = (dynamic)i;

Console.WriteLine(d);

string s = "Example string.";

d = (dynamic)s;

Console.WriteLine(d);

DateTime dt = DateTime.Today;

d = (dynamic)dt;

Console.WriteLine(d);

}

http://www.slideshare.net/IgorShkulipa 6

Использование dynamic

В любом контексте, где типы служат в качестве значений, например как типы справой стороны оператора is или as, или как аргумент в typeof в качестве частисконструированного типа.

int i = 8;

dynamic d;

if (someVar is dynamic) { }

d = i as dynamic;

Console.WriteLine(typeof(List<dynamic>));

http://www.slideshare.net/IgorShkulipa 7

Пример dynamic

class Program

{

static void Main(string[] args)

{

dynamic ExcelApp = Type.GetTypeFromProgID("Excel.Application");

dynamic Excel = Activator.CreateInstance(ExcelApp);

Excel.Visible = true;

dynamic WorkBooks = Excel.Workbooks;

WorkBooks.Add(-4167);

Excel.Cells[1, 1].Value2 = "Hello, dynamic!";

Console.ReadKey();

}

}

Атрибут -4167 является счетчиком значения рабочей книги, которыйприменяется к объектам книги.

http://www.slideshare.net/IgorShkulipa 8

Как работает тип dynamic

Несмотря на то, что dynamic – это отдельный тип в языке C#, на уровнеCLR компилятор транслирует экземпляры dynamic в экземплярыobject с присоединенным к ним атрибутом.

class Class

{

public void Method (object o) {}

public void Method (dynamic d) {}

}

Этот код компилироваться не будет, так как компилятор выдаст ошибку«Тип Class уже определяет метод Method с такими же типамиаргументов».

http://www.slideshare.net/IgorShkulipa 9

Ключевые слова var и dynamic

var указывает тип переменной, который должен быть присвоен типуинициализатора периода компиляции.

dynamic подразумевает, что тип переменной является динамическим,поддерживаемым в C# 4.0.

var улучшает статическую типизацию. Это ключевое слово помогаеткомпилятору корректно распознать тип переменной по точному типу,возвращаемому инициализатором.

Ключевое слово dynamic обеспечивает полный уход от статическойтипизации. При использовании в объявлении переменной оноуказывает компилятору вообще не обрабатывать тип переменной. Типдолжен быть таким, каким он окажется в период выполнения.

Другое различие между этими двумя ключевыми словами состоит в том,что var может появляться только в объявлении локальнойпеременной. Использовать var для определения свойства класса,возвращаемого значения или параметра функции нельзя.

http://www.slideshare.net/IgorShkulipa 10

Динамические преобразования

Все типы неявно преобразуются в dynamic в соответствии со следующимиправилами:

• Существует неявное преобразование из любого ссылочного типа в типdynamic.

• Существует неявное упаковывающее преобразование из любого типазначений в тип dynamic.

• Существует неявное преобразование идентичности из типа dynamic втип dynamic.

• Существует неявное преобразование идентичности из типа object втип dynamic.

• Существует неявное преобразование идентичности междусконструированными типами, у которых обобщенные аргументыотличаются только типами object и dynamic.

http://www.slideshare.net/IgorShkulipa 11

Динамическая перегрузка

public class StaticClass {

public static void PrintDynamic(double dbl, dynamic dyn) {

Console.WriteLine("void PrintDynamic(double dbl, dynamic dyn);");

}

public static void PrintDynamic(int i, string str) {

Console.WriteLine("void PrintDynamic(int i, string str);");

}

}

class Program {

static void Main(string[] args) {

dynamic d1 = "Hello, dynamic!";

dynamic d2 = new object();

StaticClass.PrintDynamic(1.2, d1);

StaticClass.PrintDynamic(1, d1);

StaticClass.PrintDynamic(2, d2);

Console.ReadKey();

}

}void PrintDynamic(double dbl, dynamic dyn);

void PrintDynamic(int i, string str);

void PrintDynamic(double dbl, dynamic dyn);

http://www.slideshare.net/IgorShkulipa 12

Наследование от dynamic

// Так делать нельзя!

class SomeClass : dynamic

{

}

http://www.slideshare.net/IgorShkulipa 13

Реализация интерфейсов dynamic

interface IInterface<T>

{

void DoSomething();

}

// Так тоже нельзя

class Class: IInterface<dynamic>

{

public void DoSomething() { }

}

http://www.slideshare.net/IgorShkulipa 14

Наследование от динамических базовых типов

// А так можно

class Base<T>

{

public T Value { get; set; }

}

class Derived: Base<dynamic>

{

}

http://www.slideshare.net/IgorShkulipa 15

Лабораторная работа №14. Динамические типы

В индивидуальных курсовых проектах при необходимости использоватьтип dynamic.

Recommended