Исходный код вики Преобразование типов
Редактировал(а) Alexandr Fokin 2023/06/26 11:34
Последние авторы
author | version | line-number | content |
---|---|---|---|
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; | ||
4 | p1 as ChildType{{/code}} | ||
5 | |(% style="width:138px" %)IS|(% style="width:869px" %)Проверяет является ли сущность определенным типом. | ||
6 | true/false.|(% style="width:440px" %){{code language="c#"}}bool p1 = childVar is ParentType; | ||
7 | bool p2 = instanceVar is InterfaceType; | ||
8 | |||
9 | if (instanceVar is InterfaceType interfaceTypeVar) | ||
10 | { | ||
11 | interfaceTypeVar.InterfaceMethod(); | ||
12 | }{{/code}} | ||
13 | |(% style="width:138px" %)Upcasting and Dowcasting|(% style="width:869px" %)Также как и AS выполняет попытку приведения к типу, но в случае неудачи бросает Exception.|(% style="width:440px" %){{code language="none"}}ParentType p1 = (ParentType)childVar; | ||
14 | InterfaceType p2 = (InterfaceType)instanceVar; | ||
15 | (ChildType)p1;{{/code}} | ||
16 | |(% style="width:138px" %)implicit and explicit operator|(% style="width:869px" %)((( | ||
17 | Механизм который при вызове может выглядеть словно (Upcasting and Dowcasting), но на самом деле выполняющий преобразование одного типа в другой (подразумевает логику создания экземпляра целевого типа и наполнение его данными на основе переданной сущности). | ||
18 | В теле класса может быть определен метод как преобразование экземпляров класса в экземпляры внешнего типа, так и экземпляр внешнего типа в экземпляр класса. | ||
19 | \\Имеет определенные ограничения: например не позволяет указывать преобразования дочернего типа к родительскому иначе бы приводил к неоднозначности. | ||
20 | |||
21 | Во многих случаях лучше явно реализовать модуль преобразования в виде отдельного компонента бизнес логики (Converter / Transformator / Mapper), а не использовать данный механизм. Механизм больше подходит для преобразования базовых или примитивных типов (Например наличие в проекте собственного специализированного числового типа данных, которые преобразуется в некоторые стандартные типы). | ||
22 | )))|(% style="width:440px" %){{code language="c#"}}class MyClass1 | ||
23 | { | ||
24 | public static implicit operator Type1 (MyClass1 instance) | ||
25 | { /*...*/ } | ||
26 | } | ||
27 | class MyClass2 | ||
28 | { | ||
29 | public static explicit operator Type1 (MyClass2 instance) | ||
30 | { /*...*/ } | ||
31 | } | ||
32 | |||
33 | static void Action(Type1 param){ /*...*/ } | ||
34 | |||
35 | MyClass1 myClass1Var; | ||
36 | MyClass2 myClass2Var; | ||
37 | |||
38 | Action(myClass1Var); //implicit | ||
39 | Action((Type1)myClass1Var); //explicit{{/code}} | ||
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}} | ||
53 | |(% style="width:138px" %)Ковариантность и контравариантность|(% style="width:869px" %)Ковариантность и контравариантность обобщенных интерфейсов | ||
54 | [[https:~~/~~/metanit.com/sharp/tutorial/3.27.php>>https://metanit.com/sharp/tutorial/3.27.php]]|(% style="width:440px" %) |