C# Desktop. Занятие 14.
-
Upload
igor-shkulipa -
Category
Education
-
view
62 -
download
1
Transcript of C# Desktop. Занятие 14.
Темы лекции: Динамические типы.
Практическое задание: Динамические типы.
Тренер: Игорь Шкулипа, к.т.н.
Платформа .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.