SlideShare a Scribd company logo
1 of 15
Download to read offline
Темы лекции: Динамические типы.
Практическое задание: Динамические типы.
Тренер: Игорь Шкулипа, к.т.н.
Платформа .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.

More Related Content

What's hot

Refactorings with RubyMine
Refactorings with RubyMineRefactorings with RubyMine
Refactorings with RubyMineavokin
 
Cтатический анализ кода (на примере DDD-фреймворка)
Cтатический анализ кода (на примере DDD-фреймворка)Cтатический анализ кода (на примере DDD-фреймворка)
Cтатический анализ кода (на примере DDD-фреймворка)ngrebnev
 
язык програмирования
язык програмированияязык програмирования
язык програмированияOlegmingalev1997
 
Статический анализ кода в DDD
Статический анализ кода в DDDСтатический анализ кода в DDD
Статический анализ кода в DDDAleksei Alekseev
 
javascript_part1
javascript_part1javascript_part1
javascript_part1sovest
 
Массивы в Java
Массивы в JavaМассивы в Java
Массивы в Javametaform
 

What's hot (8)

Refactorings with RubyMine
Refactorings with RubyMineRefactorings with RubyMine
Refactorings with RubyMine
 
Cтатический анализ кода (на примере DDD-фреймворка)
Cтатический анализ кода (на примере DDD-фреймворка)Cтатический анализ кода (на примере DDD-фреймворка)
Cтатический анализ кода (на примере DDD-фреймворка)
 
fp intro
fp introfp intro
fp intro
 
язык програмирования
язык програмированияязык програмирования
язык програмирования
 
TypeScript
TypeScriptTypeScript
TypeScript
 
Статический анализ кода в DDD
Статический анализ кода в DDDСтатический анализ кода в DDD
Статический анализ кода в DDD
 
javascript_part1
javascript_part1javascript_part1
javascript_part1
 
Массивы в Java
Массивы в JavaМассивы в Java
Массивы в Java
 

Viewers also liked

JavaScript Базовый. Занятие 03.
JavaScript Базовый. Занятие 03.JavaScript Базовый. Занятие 03.
JavaScript Базовый. Занятие 03.Igor Shkulipa
 
C# Desktop. Занятие 10.
C# Desktop. Занятие 10.C# Desktop. Занятие 10.
C# Desktop. Занятие 10.Igor Shkulipa
 
C# Web. Занятие 13.
C# Web. Занятие 13.C# Web. Занятие 13.
C# Web. Занятие 13.Igor Shkulipa
 
JavaScript Базовый. Занятие 11.
JavaScript Базовый. Занятие 11.JavaScript Базовый. Занятие 11.
JavaScript Базовый. Занятие 11.Igor Shkulipa
 
C# Desktop. Занятие 02.
C# Desktop. Занятие 02.C# Desktop. Занятие 02.
C# Desktop. Занятие 02.Igor Shkulipa
 
C# Web. Занятие 02.
C# Web. Занятие 02.C# Web. Занятие 02.
C# Web. Занятие 02.Igor Shkulipa
 
Production diary 10
Production diary 10Production diary 10
Production diary 10Laila Jaleel
 
Production diary 11
Production diary 11Production diary 11
Production diary 11Laila Jaleel
 
Mid map gaya belajar
Mid map gaya belajarMid map gaya belajar
Mid map gaya belajarsanty1301
 
Vijay Bhosekar_ Published Article_ Organic Agriculture
Vijay Bhosekar_ Published Article_ Organic AgricultureVijay Bhosekar_ Published Article_ Organic Agriculture
Vijay Bhosekar_ Published Article_ Organic Agriculturevijay bhosekar
 
JavaScript Базовый. Занятие 05.
JavaScript Базовый. Занятие 05.JavaScript Базовый. Занятие 05.
JavaScript Базовый. Занятие 05.Igor Shkulipa
 
Общие темы. Тема 01.
Общие темы. Тема 01.Общие темы. Тема 01.
Общие темы. Тема 01.Igor Shkulipa
 
C# Web. Занятие 01.
C# Web. Занятие 01.C# Web. Занятие 01.
C# Web. Занятие 01.Igor Shkulipa
 
C++ Базовый. Занятие 14.
C++ Базовый. Занятие 14.C++ Базовый. Занятие 14.
C++ Базовый. Занятие 14.Igor Shkulipa
 
Enhancing Energy Efficiency in Cloud Management through Code Annotations and ...
Enhancing Energy Efficiency in Cloud Management through Code Annotations and ...Enhancing Energy Efficiency in Cloud Management through Code Annotations and ...
Enhancing Energy Efficiency in Cloud Management through Code Annotations and ...Luigi Sambolino
 

Viewers also liked (20)

JavaScript Базовый. Занятие 03.
JavaScript Базовый. Занятие 03.JavaScript Базовый. Занятие 03.
JavaScript Базовый. Занятие 03.
 
Google tablet
Google tabletGoogle tablet
Google tablet
 
C# Desktop. Занятие 10.
C# Desktop. Занятие 10.C# Desktop. Занятие 10.
C# Desktop. Занятие 10.
 
Catalog AdPro
Catalog AdProCatalog AdPro
Catalog AdPro
 
C# Web. Занятие 13.
C# Web. Занятие 13.C# Web. Занятие 13.
C# Web. Занятие 13.
 
JavaScript Базовый. Занятие 11.
JavaScript Базовый. Занятие 11.JavaScript Базовый. Занятие 11.
JavaScript Базовый. Занятие 11.
 
C# Desktop. Занятие 02.
C# Desktop. Занятие 02.C# Desktop. Занятие 02.
C# Desktop. Занятие 02.
 
10 Reasons to Trademark Your Business
10 Reasons to Trademark Your Business10 Reasons to Trademark Your Business
10 Reasons to Trademark Your Business
 
C# Web. Занятие 02.
C# Web. Занятие 02.C# Web. Занятие 02.
C# Web. Занятие 02.
 
Production diary 10
Production diary 10Production diary 10
Production diary 10
 
Production diary 11
Production diary 11Production diary 11
Production diary 11
 
Mid map gaya belajar
Mid map gaya belajarMid map gaya belajar
Mid map gaya belajar
 
Vijay Bhosekar_ Published Article_ Organic Agriculture
Vijay Bhosekar_ Published Article_ Organic AgricultureVijay Bhosekar_ Published Article_ Organic Agriculture
Vijay Bhosekar_ Published Article_ Organic Agriculture
 
JavaScript Базовый. Занятие 05.
JavaScript Базовый. Занятие 05.JavaScript Базовый. Занятие 05.
JavaScript Базовый. Занятие 05.
 
Общие темы. Тема 01.
Общие темы. Тема 01.Общие темы. Тема 01.
Общие темы. Тема 01.
 
C# Web. Занятие 01.
C# Web. Занятие 01.C# Web. Занятие 01.
C# Web. Занятие 01.
 
C++ Базовый. Занятие 14.
C++ Базовый. Занятие 14.C++ Базовый. Занятие 14.
C++ Базовый. Занятие 14.
 
Enhancing Energy Efficiency in Cloud Management through Code Annotations and ...
Enhancing Energy Efficiency in Cloud Management through Code Annotations and ...Enhancing Energy Efficiency in Cloud Management through Code Annotations and ...
Enhancing Energy Efficiency in Cloud Management through Code Annotations and ...
 
Energías limpias
Energías limpiasEnergías limpias
Energías limpias
 
Pest & Fumi-(Shiva Resume)
Pest & Fumi-(Shiva Resume)Pest & Fumi-(Shiva Resume)
Pest & Fumi-(Shiva Resume)
 

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

C++ осень 2012 лекция 6
C++ осень 2012 лекция 6C++ осень 2012 лекция 6
C++ осень 2012 лекция 6Technopark
 
Классы и объекты в Java
Классы и объекты в JavaКлассы и объекты в Java
Классы и объекты в Javametaform
 
C++ осень 2013 лекция 7
C++ осень 2013 лекция 7C++ осень 2013 лекция 7
C++ осень 2013 лекция 7Technopark
 
Java Core. Lecture# 2. Classes & objects.
Java Core. Lecture# 2. Classes & objects.Java Core. Lecture# 2. Classes & objects.
Java Core. Lecture# 2. Classes & objects.Anton Moiseenko
 
Vba программы
Vba программыVba программы
Vba программыLidiKashka
 
Классы и объекты в Java
Классы и объекты в JavaКлассы и объекты в Java
Классы и объекты в Javametaform
 
Как это работает: DLR
Как это работает: DLRКак это работает: DLR
Как это работает: DLRMikhail Shcherbakov
 
C# Desktop. Занятие 16.
C# Desktop. Занятие 16.C# Desktop. Занятие 16.
C# Desktop. Занятие 16.Igor Shkulipa
 
C# Desktop. Занятие 07.
C# Desktop. Занятие 07.C# Desktop. Занятие 07.
C# Desktop. Занятие 07.Igor Shkulipa
 
особенности программирования на с++
особенности программирования на с++особенности программирования на с++
особенности программирования на с++mcroitor
 
kranonit S15 Vladimir Melnik - Ruby on Rails, BDD
kranonit S15 Vladimir Melnik - Ruby on Rails, BDDkranonit S15 Vladimir Melnik - Ruby on Rails, BDD
kranonit S15 Vladimir Melnik - Ruby on Rails, BDDKrivoy Rog IT Community
 
C++ осень 2013 лекция 3
C++ осень 2013 лекция 3C++ осень 2013 лекция 3
C++ осень 2013 лекция 3Technopark
 
JavaScript Базовый. Занятие 02.
JavaScript Базовый. Занятие 02.JavaScript Базовый. Занятие 02.
JavaScript Базовый. Занятие 02.Igor Shkulipa
 
Опыт разработки сложных клиент-серверных приложений на TypeScript и ASP.NET
Опыт разработки сложных клиент-серверных приложений на TypeScript и ASP.NETОпыт разработки сложных клиент-серверных приложений на TypeScript и ASP.NET
Опыт разработки сложных клиент-серверных приложений на TypeScript и ASP.NETGoSharp
 
1 Презентация функциональное программирование
1 Презентация функциональное программирование1 Презентация функциональное программирование
1 Презентация функциональное программированиеSTEP Computer Academy (Zaporozhye)
 
C++ Базовый. Занятие 03.
C++ Базовый. Занятие 03.C++ Базовый. Занятие 03.
C++ Базовый. Занятие 03.Igor Shkulipa
 

Similar to C# Desktop. Занятие 14. (18)

C++ осень 2012 лекция 6
C++ осень 2012 лекция 6C++ осень 2012 лекция 6
C++ осень 2012 лекция 6
 
Классы и объекты в Java
Классы и объекты в JavaКлассы и объекты в Java
Классы и объекты в Java
 
C++ осень 2013 лекция 7
C++ осень 2013 лекция 7C++ осень 2013 лекция 7
C++ осень 2013 лекция 7
 
Java Core. Lecture# 2. Classes & objects.
Java Core. Lecture# 2. Classes & objects.Java Core. Lecture# 2. Classes & objects.
Java Core. Lecture# 2. Classes & objects.
 
Refactoring
RefactoringRefactoring
Refactoring
 
Vba программы
Vba программыVba программы
Vba программы
 
Классы и объекты в Java
Классы и объекты в JavaКлассы и объекты в Java
Классы и объекты в Java
 
лек5 6
лек5 6лек5 6
лек5 6
 
Как это работает: DLR
Как это работает: DLRКак это работает: DLR
Как это работает: DLR
 
C# Desktop. Занятие 16.
C# Desktop. Занятие 16.C# Desktop. Занятие 16.
C# Desktop. Занятие 16.
 
C# Desktop. Занятие 07.
C# Desktop. Занятие 07.C# Desktop. Занятие 07.
C# Desktop. Занятие 07.
 
особенности программирования на с++
особенности программирования на с++особенности программирования на с++
особенности программирования на с++
 
kranonit S15 Vladimir Melnik - Ruby on Rails, BDD
kranonit S15 Vladimir Melnik - Ruby on Rails, BDDkranonit S15 Vladimir Melnik - Ruby on Rails, BDD
kranonit S15 Vladimir Melnik - Ruby on Rails, BDD
 
C++ осень 2013 лекция 3
C++ осень 2013 лекция 3C++ осень 2013 лекция 3
C++ осень 2013 лекция 3
 
JavaScript Базовый. Занятие 02.
JavaScript Базовый. Занятие 02.JavaScript Базовый. Занятие 02.
JavaScript Базовый. Занятие 02.
 
Опыт разработки сложных клиент-серверных приложений на TypeScript и ASP.NET
Опыт разработки сложных клиент-серверных приложений на TypeScript и ASP.NETОпыт разработки сложных клиент-серверных приложений на TypeScript и ASP.NET
Опыт разработки сложных клиент-серверных приложений на TypeScript и ASP.NET
 
1 Презентация функциональное программирование
1 Презентация функциональное программирование1 Презентация функциональное программирование
1 Презентация функциональное программирование
 
C++ Базовый. Занятие 03.
C++ Базовый. Занятие 03.C++ Базовый. Занятие 03.
C++ Базовый. Занятие 03.
 

More from Igor Shkulipa

Общие темы. Тема 03.
Общие темы. Тема 03. Общие темы. Тема 03.
Общие темы. Тема 03. Igor Shkulipa
 
Общие темы. Тема 02.
Общие темы. Тема 02.Общие темы. Тема 02.
Общие темы. Тема 02.Igor Shkulipa
 
JavaScript Базовый. Занятие 06.
JavaScript Базовый. Занятие 06.JavaScript Базовый. Занятие 06.
JavaScript Базовый. Занятие 06.Igor Shkulipa
 
JavaScript Базовый. Занятие 09.
JavaScript Базовый. Занятие 09.JavaScript Базовый. Занятие 09.
JavaScript Базовый. Занятие 09.Igor Shkulipa
 
JavaScript Базовый. Занятие 10.
JavaScript Базовый. Занятие 10.JavaScript Базовый. Занятие 10.
JavaScript Базовый. Занятие 10.Igor Shkulipa
 
JavaScript Базовый. Занятие 08.
JavaScript Базовый. Занятие 08.JavaScript Базовый. Занятие 08.
JavaScript Базовый. Занятие 08.Igor Shkulipa
 
JavaScript Базовый. Занятие 07.
JavaScript Базовый. Занятие 07.JavaScript Базовый. Занятие 07.
JavaScript Базовый. Занятие 07.Igor Shkulipa
 
JavaScript Базовый. Занятие 01.
JavaScript Базовый. Занятие 01.JavaScript Базовый. Занятие 01.
JavaScript Базовый. Занятие 01.Igor Shkulipa
 
JavaScript Базовый. Занятие 04.
JavaScript Базовый. Занятие 04.JavaScript Базовый. Занятие 04.
JavaScript Базовый. Занятие 04.Igor Shkulipa
 
C# Web. Занятие 09.
C# Web. Занятие 09.C# Web. Занятие 09.
C# Web. Занятие 09.Igor Shkulipa
 
C# Web. Занятие 08.
C# Web. Занятие 08.C# Web. Занятие 08.
C# Web. Занятие 08.Igor Shkulipa
 
C# Web. Занятие 07.
C# Web. Занятие 07.C# Web. Занятие 07.
C# Web. Занятие 07.Igor Shkulipa
 
C# Web. Занятие 04.
C# Web. Занятие 04.C# Web. Занятие 04.
C# Web. Занятие 04.Igor Shkulipa
 
C# Web. Занятие 12.
C# Web. Занятие 12.C# Web. Занятие 12.
C# Web. Занятие 12.Igor Shkulipa
 
C# Web. Занятие 16.
C# Web. Занятие 16.C# Web. Занятие 16.
C# Web. Занятие 16.Igor Shkulipa
 
C# Web. Занятие 14.
C# Web. Занятие 14.C# Web. Занятие 14.
C# Web. Занятие 14.Igor Shkulipa
 
C# Web. Занятие 15.
C# Web. Занятие 15.C# Web. Занятие 15.
C# Web. Занятие 15.Igor Shkulipa
 
C# Web. Занятие 11.
C# Web. Занятие 11.C# Web. Занятие 11.
C# Web. Занятие 11.Igor Shkulipa
 
C# Web. Занятие 10.
C# Web. Занятие 10.C# Web. Занятие 10.
C# Web. Занятие 10.Igor Shkulipa
 
C# Web. Занятие 05.
C# Web. Занятие 05.C# Web. Занятие 05.
C# Web. Занятие 05.Igor Shkulipa
 

More from Igor Shkulipa (20)

Общие темы. Тема 03.
Общие темы. Тема 03. Общие темы. Тема 03.
Общие темы. Тема 03.
 
Общие темы. Тема 02.
Общие темы. Тема 02.Общие темы. Тема 02.
Общие темы. Тема 02.
 
JavaScript Базовый. Занятие 06.
JavaScript Базовый. Занятие 06.JavaScript Базовый. Занятие 06.
JavaScript Базовый. Занятие 06.
 
JavaScript Базовый. Занятие 09.
JavaScript Базовый. Занятие 09.JavaScript Базовый. Занятие 09.
JavaScript Базовый. Занятие 09.
 
JavaScript Базовый. Занятие 10.
JavaScript Базовый. Занятие 10.JavaScript Базовый. Занятие 10.
JavaScript Базовый. Занятие 10.
 
JavaScript Базовый. Занятие 08.
JavaScript Базовый. Занятие 08.JavaScript Базовый. Занятие 08.
JavaScript Базовый. Занятие 08.
 
JavaScript Базовый. Занятие 07.
JavaScript Базовый. Занятие 07.JavaScript Базовый. Занятие 07.
JavaScript Базовый. Занятие 07.
 
JavaScript Базовый. Занятие 01.
JavaScript Базовый. Занятие 01.JavaScript Базовый. Занятие 01.
JavaScript Базовый. Занятие 01.
 
JavaScript Базовый. Занятие 04.
JavaScript Базовый. Занятие 04.JavaScript Базовый. Занятие 04.
JavaScript Базовый. Занятие 04.
 
C# Web. Занятие 09.
C# Web. Занятие 09.C# Web. Занятие 09.
C# Web. Занятие 09.
 
C# Web. Занятие 08.
C# Web. Занятие 08.C# Web. Занятие 08.
C# Web. Занятие 08.
 
C# Web. Занятие 07.
C# Web. Занятие 07.C# Web. Занятие 07.
C# Web. Занятие 07.
 
C# Web. Занятие 04.
C# Web. Занятие 04.C# Web. Занятие 04.
C# Web. Занятие 04.
 
C# Web. Занятие 12.
C# Web. Занятие 12.C# Web. Занятие 12.
C# Web. Занятие 12.
 
C# Web. Занятие 16.
C# Web. Занятие 16.C# Web. Занятие 16.
C# Web. Занятие 16.
 
C# Web. Занятие 14.
C# Web. Занятие 14.C# Web. Занятие 14.
C# Web. Занятие 14.
 
C# Web. Занятие 15.
C# Web. Занятие 15.C# Web. Занятие 15.
C# Web. Занятие 15.
 
C# Web. Занятие 11.
C# Web. Занятие 11.C# Web. Занятие 11.
C# Web. Занятие 11.
 
C# Web. Занятие 10.
C# Web. Занятие 10.C# Web. Занятие 10.
C# Web. Занятие 10.
 
C# Web. Занятие 05.
C# Web. Занятие 05.C# Web. Занятие 05.
C# Web. Занятие 05.
 

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

  • 1. Темы лекции: Динамические типы. Практическое задание: Динамические типы. Тренер: Игорь Шкулипа, к.т.н. Платформа .Net и язык программирования C#. Занятие 14
  • 2. 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
  • 3. http://www.slideshare.net/IgorShkulipa 3 Разница между object и dynamic Чтобы понять различие между dyn и obj во время компиляции, можно добавить следующие две строки между объявлениями и операторами WriteLine в предыдущем примере. dyn = dyn + 3; obj = obj + 3; • При попытке добавления целого числа или объекта в выражение obj + 3 выводится ошибка компиляции. • А для dyn + 3 нет сообщений об ошибках . Выражение, содержащее dyn, не проверяется во время компиляции, поскольку тип dyn задан как dynamic.
  • 4. 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; } } }
  • 5. 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); }
  • 6. 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>));
  • 7. 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 является счетчиком значения рабочей книги, который применяется к объектам книги.
  • 8. 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 с такими же типами аргументов».
  • 9. http://www.slideshare.net/IgorShkulipa 9 Ключевые слова var и dynamic var указывает тип переменной, который должен быть присвоен типу инициализатора периода компиляции. dynamic подразумевает, что тип переменной является динамическим, поддерживаемым в C# 4.0. var улучшает статическую типизацию. Это ключевое слово помогает компилятору корректно распознать тип переменной по точному типу, возвращаемому инициализатором. Ключевое слово dynamic обеспечивает полный уход от статической типизации. При использовании в объявлении переменной оно указывает компилятору вообще не обрабатывать тип переменной. Тип должен быть таким, каким он окажется в период выполнения. Другое различие между этими двумя ключевыми словами состоит в том, что var может появляться только в объявлении локальной переменной. Использовать var для определения свойства класса, возвращаемого значения или параметра функции нельзя.
  • 10. http://www.slideshare.net/IgorShkulipa 10 Динамические преобразования Все типы неявно преобразуются в dynamic в соответствии со следующими правилами: • Существует неявное преобразование из любого ссылочного типа в тип dynamic. • Существует неявное упаковывающее преобразование из любого типа значений в тип dynamic. • Существует неявное преобразование идентичности из типа dynamic в тип dynamic. • Существует неявное преобразование идентичности из типа object в тип dynamic. • Существует неявное преобразование идентичности между сконструированными типами, у которых обобщенные аргументы отличаются только типами object и dynamic.
  • 11. 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);
  • 12. http://www.slideshare.net/IgorShkulipa 12 Наследование от dynamic // Так делать нельзя! class SomeClass : dynamic { }
  • 13. http://www.slideshare.net/IgorShkulipa 13 Реализация интерфейсов dynamic interface IInterface<T> { void DoSomething(); } // Так тоже нельзя class Class: IInterface<dynamic> { public void DoSomething() { } }
  • 14. http://www.slideshare.net/IgorShkulipa 14 Наследование от динамических базовых типов // А так можно class Base<T> { public T Value { get; set; } } class Derived: Base<dynamic> { }
  • 15. http://www.slideshare.net/IgorShkulipa 15 Лабораторная работа №14. Динамические типы В индивидуальных курсовых проектах при необходимости использовать тип dynamic.