Исходный код вики Преобразование типов

Версия 1.10 от Alexandr Fokin на 2023/02/25 13:23

Скрыть последних авторов
Alexandr Fokin 1.1 1 |(% style="width:138px" %)AS|(% style="width:869px" %)Выполняет попытку приведения к родительскому или дочернему типу (относительно типа переменной) интерфейсному типу.
Alexandr Fokin 1.8 2 В случае неудачи возвращает null, не выбрасывает ошибку|(% style="width:440px" %){{code language="c#"}}ParentType p1 = ChildVar as ParentType;
3 InterfaceType p2 = instanceVar as InterfaceType;
4 p1 as ChildType{{/code}}
Alexandr Fokin 1.1 5 |(% style="width:138px" %)IS|(% style="width:869px" %)Проверяет является ли сущность определенным типом.
Alexandr Fokin 1.8 6 true/false.|(% style="width:440px" %){{code language="c#"}}bool p1 = childVar is ParentType;
7 bool p2 = instanceVar is InterfaceType;
Alexandr Fokin 1.1 8
Alexandr Fokin 1.8 9 if (instanceVar is InterfaceType interfaceTypeVar)
Alexandr Fokin 1.1 10 {
11 interfaceTypeVar.InterfaceMethod();
12 }{{/code}}
Alexandr Fokin 1.8 13 |(% style="width:138px" %)Upcasting and Dowcasting|(% style="width:869px" %)Также как и AS выполняет попытку приведения к типу, но в случае ошибки бросает Exception.|(% style="width:440px" %){{code language="none"}}​ParentType p1 = (ParentType)childVar;
Alexandr Fokin 1.9 14 InterfaceType p2 = (InterfaceType)instanceVar;​
Alexandr Fokin 1.10 15 (​ChildType)p1;{{/code}}
Alexandr Fokin 1.1 16 |(% style="width:138px" %)implicit and explicit operator|(% style="width:869px" %)(((
17 Механизм который при вызове может выглядеть словно (Upcasting and Dowcasting), но на самом деле выполняющий преобразование одного типа в другой (подразумевает логику создания экземпляра целевого типа и наполнение его данными на основе переданной сущности).
18 В теле класса может быть определен метод как преобразование экземпляров класса в экземпляры внешнего типа, так и экземпляр внешнего типа в экземпляр класса.
19 \\Имеет определенные ограничения: например не позволяет указывать преобразования дочернего типа к родительскому иначе бы приводил к неоднозначности.
Alexandr Fokin 1.2 20
Alexandr Fokin 1.6 21 Во многих случаях лучше явно реализовать модуль преобразования в виде отдельного компонента бизнес логики (Converter / Transformator), а не использовать данных механизм. Механизм больше подходит для преобразования базовых или примитивных типов (Например наличие в проекте собственного специализированного числового типа данных, которые преобразуется в некоторые стандартные типы).
Alexandr Fokin 1.1 22 )))|(% style="width:440px" %){{code language="c#"}}class MyClass1
23 {
24 public static implicit operator Type1 (MyClass1 instance)
Alexandr Fokin 1.7 25 { /*...*/ }
Alexandr Fokin 1.1 26 }
27 class MyClass2
28 {
29 public static explicit operator Type1 (MyClass2 instance)
Alexandr Fokin 1.7 30 { /*...*/ }
Alexandr Fokin 1.1 31 }
32
Alexandr Fokin 1.7 33 static void Action(Type1 param){ /*...*/ }
Alexandr Fokin 1.1 34
35 MyClass1 myClass1Var;
36 MyClass2 myClass2Var;
37
38 Action(myClass1Var); //implicit
Alexandr Fokin 1.3 39 Action((Type1)myClass1Var); //explicit{{/code}}
Alexandr Fokin 1.1 40 |(% style="width:138px" %)Ограничения для Generic типов|(% style="width:869px" %) |(% style="width:440px" %){{code language="c#"}}interface Logic1
41 {
42 //В случае struct приведет к упаковке
43 void Method1(ParameterInterfaceType param)
44 }
45
46 interface Logic2
47 {
48 //В случае struct не будет упаковки,
49 //произойдет обычная передача параметра с копированием
50 void Method1<T>(T param)
51 where T : ParameterInterfaceType
52 }{{/code}}