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