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

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

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