Преобразования типов в C#
Содержание
Что такое конверсии в C#?
Преобразование - это механизм преобразования значения одного типа в эквивалентное значение другого типа. Давайте рассмотрим ниже пример, чтобы лучше понять его.
1. var1 имеет тип short, 16-разрядное целое число со знаком, которое инициализировано на 5. var2 имеет тип sbyte, 8-разрядное целое число со знаком, которое инициализируется значением 10.
2. Затем значение var1 присваивается var2. Так как это два разных типа, значение var1 должно быть преобразовано в значение того же типа, что и var2, прежде чем выполнить назначение.
3. Если вы посмотрите на результат, значение var1 не изменится, а var2 будет иметь такое же значение, как var1.
Различные типы конверсий в C#
Мы обсудим различные типы конверсий в C#.
- Неявное преобразование
- Явное преобразование
- Пользовательское преобразование
Неявное преобразование:
- Компилятор автоматически выполняет эти преобразования
- При преобразовании из меньшего типа данных в более крупный тип, дополнительные наиболее значимые биты цели заполняются 0.
- Никакие данные не будут потеряны в Implicit Conversion
Пример:
class Program { static void Main(string[] args) { int a = 5; Console.WriteLine(a); //Неявное преобразование из a в b. double b = a; Console.WriteLine(b); } }
Вывод:
5
5
Явное преобразование:
- Когда вы конвертируете из более короткого типа в более длинный тип, для более длинного типа легко сохранить все биты более короткого типа, но при преобразовании из более длинного типа в более короткий тип целевого типа может оказаться несовместимым с исходным значением без потери данных.
- Это приводит к переполнению и потере данных
Пример:
class Program { static void Main(string[] args) { double a = 5; Console.WriteLine(a); // Неявное преобразование из a в b. int b = (int) a; Console.WriteLine(b); } }
Вывод:
5
5
В приведенном выше примере, когда мы попытаемся преобразовать double в int, нам нужно явно использовать, используя int else, мы получим ошибку.
Пользовательское преобразование:
- вы также можете определить как неявные, так и явные преобразования для ваших собственных классов и структур.
- Синтаксис одинаковый как для неявных, так и для явных объявлений преобразования, за исключением явных и явных ключевых слов.
- Требуются как публичные, так и статические модификаторы
Пример:
class Person { public string Name; public int Age; public Person(string name, int age) { Name = name; Age = age; } public static implicit operator int(Person p) // Преобразование Person в int. { return p.Age; } public static implicit operator Person(int i) // Преобразование int в Person. { return new Person("Tina", i); } } class Program { static void Main() { Person Person1 = new Person("Mike", 25); int age = Person1; Console.WriteLine("Person Info: {0}, {1}", Person1.Name, age); Person Person2 = 35; Console.WriteLine("Person Info: {0}, {1}", Person2.Name, Person2.Age); } }
Ограничения по пользовательскому преобразованию:
- Вы можете определять только определенные пользователем преобразования для классов и структур.
- Вы не можете переопределять стандартные неявные или явные преобразования.
- Для типа источника S и целевого типа T справедливы следующие значения:
- S и T должны быть разных типов.
- S и T не могут быть связаны наследованием. То есть S не может быть выведено из T, а T не может быть выведено из S.
- Ни S, ни T не могут быть интерфейсом или объектом типа.
- Оператор преобразования должен быть членом либо S, либо T. - Вы не можете объявить две конверсии, одну неявную и другую явную, с одинаковыми исходными и целевыми типами.