15
Темы лекции: Динамические типы. Практическое задание: Динамические типы. Тренер: Игорь Шкулипа, к.т.н. Платформа .Net и язык программирования C#. Занятие 14

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

Embed Size (px)

Citation preview

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

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

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

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

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

Занятие 14

Page 2: C# Desktop. Занятие 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

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

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

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

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

dyn = dyn + 3;

obj = obj + 3;

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

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

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

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

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;

}

}

}

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

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);

}

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

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>));

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

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 является счетчиком значения рабочей книги, которыйприменяется к объектам книги.

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

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 с такими же типамиаргументов».

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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);

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

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

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

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

class SomeClass : dynamic

{

}

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

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

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

interface IInterface<T>

{

void DoSomething();

}

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

class Class: IInterface<dynamic>

{

public void DoSomething() { }

}

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

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

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

// А так можно

class Base<T>

{

public T Value { get; set; }

}

class Derived: Base<dynamic>

{

}

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

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

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

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