C# Преобразование типов
В C# преобразование типов — это процесс преобразования значения одного типа данных в другой тип данных.
Преобразование типов в C# можно разделить на два типа:Неявное преобразование типовиЯвное преобразование типов(также известное как принудительное преобразование типов).
Неявное преобразование типов
Неявное преобразование — это преобразование, которое не требует написания кода для его указания; компилятор выполняет его автоматически.
Неявное преобразование означает, что при преобразовании типа данных с меньшим диапазоном в тип данных с большим диапазоном компилятор автоматически выполняет преобразование типов. Эти преобразования являются преобразованиями C# по умолчанию, выполняемыми безопасным образом, и не приводят к потере данных.
Например, из int в long, из float в double и т. д.
Преобразование из меньшего целочисленного типа в больший целочисленный тип или из производного класса в базовый класс. При присваивании переменной типа byte переменной типа int компилятор автоматически преобразует тип byte в тип int без необходимости явного преобразования.
Пример
int i = b; // Неявное преобразование, явное преобразование не требуется
Присваивание целого числа длинному целому числу или присваивание числа с плавающей запятой числу с плавающей запятой двойной точности — такой вид преобразования не приводит к потере данных:
Пример
long longValue = intValue; // Неявное преобразование из int в long
Явное преобразование
Явное преобразование типа, также известное как принудительное преобразование типа, требует, чтобы программист явно указал его в коде.
Явное преобразование означает, что при преобразовании типа данных с большим диапазоном в тип данных с меньшим диапазоном или при преобразовании одного объектного типа в другой объектный тип для явного преобразования требуется оператор приведения. Принудительное преобразование может привести к потере данных.
Например, присваивание переменной типа int переменной типа byte требует явного преобразования.
Пример
byte b = (byte)i; // Явное преобразование, требуется оператор приведения
Приведение к целочисленному типу:
Пример
int intValue = (int)doubleValue; // Принудительное приведение double к int; данные могут потерять дробную часть
Приведение к типу с плавающей запятой:
Пример
float floatValue = (float)intValue; // Принудительное преобразование из int в float, данные могут потерять точность
Приведение к строковому типу:
Пример
string stringValue = intValue.ToString(); // Преобразование int в string
В следующем примере демонстрируется явное преобразование типа:
Пример
namespace TypeConversionApplication
{
class ExplicitConversion
{
static void Main(string[] args)
{
double d = 5673.74;
int i;
// Приведение double к int
i = (int)d;
Console.WriteLine(i);
Console.ReadKey();
}
}
}
Когда приведенный выше код скомпилирован и выполнен, он выдает следующие результаты:
5673
Методы преобразования типов в C#
C# предоставляет следующие встроенные методы преобразования типов:
| Порядковый номер | Метод и описание |
|---|---|
| 1 | ToBoolean Преобразовать тип в логическое значение, если это возможно. |
| 2 | ToByte Преобразует тип в тип byte. |
| 3 | ToChar Преобразовать тип в тип одиночного символа Unicode, если это возможно. |
| 4 | ToDateTime Преобразовать тип (целочисленный или строковый тип) в структуру даты и времени. |
| 5 | ToDecimal Преобразовать тип с плавающей запятой или целочисленный тип в десятичный тип. |
| 6 | ToDouble Преобразует тип в тип с плавающей запятой двойной точности. |
| 7 | ToInt16 Преобразовать тип в 16-битный целочисленный тип. |
| 8 | ToInt32 Преобразовать тип в 32-битный целочисленный тип. |
| 9 | ToInt64 Преобразовать тип в 64-битный целочисленный тип. |
| 10 | ToSbyte Преобразует тип в знаковый байтовый тип. |
| 11 | ToSingle Преобразует тип в тип числа с плавающей запятой малой точности. |
| 12 | ToString Преобразует тип в строковый тип. |
| 13 | ToType Преобразует тип в указанный тип. |
| 14 | ToUInt16 Преобразует тип в 16-битный целочисленный тип без знака. |
| 15 | ToUInt32 Преобразует тип в 32-битный целочисленный тип без знака. |
| 16 | ToUInt64 Преобразует тип в 64-битный целочисленный тип без знака. |
Все эти методы определены в классе System.Convert, и при их использовании необходимо включить пространство имен System. Они обеспечивают безопасный способ выполнения преобразования типов, так как могут обрабатывать значения null и вызовут исключение, если преобразование невозможно.
Например, использование метода Convert.ToInt32 для преобразования строки в целое число:
string str = "123"; int number = Convert.ToInt32(str); // 转换成功,number为123
Если строка не является допустимым представлением целого числа, Convert.ToInt32 вызовет исключение FormatException.
В следующем примере типы различных значений преобразуются в строковые типы:
Пример
namespace TypeConversionApplication
{
class StringConversion
{
static void Main(string[] args)
{
// Определить целочисленную переменную
int i = 75;
// Определить переменную с плавающей запятой
float f = 53.005f;
// Определить переменную с плавающей запятой двойной точности
double d = 2345.7652;
// Определить логическую переменную
bool b = true;
// Преобразовать целочисленную переменную в строку и вывести её
Console.WriteLine(i.ToString());
// Преобразовать переменную с плавающей запятой в строку и вывести
Console.WriteLine(f.ToString());
// Преобразовать переменную с плавающей запятой двойной точности в строку и вывести её
Console.WriteLine(d.ToString());
// Преобразовать логическую переменную в строку и вывести
Console.WriteLine(b.ToString());
// Дождаться, пока пользователь нажмёт клавишу, прежде чем закрыть окно консоли
Console.ReadKey();
}
}
}
Когда приведенный выше код скомпилирован и выполнен, он выдает следующие результаты:
75 53.005 2345.7652 True
При выполнении преобразования типов необходимо учитывать следующие моменты:
- Неявное преобразование может преобразовать только тип данных с меньшим диапазоном в тип данных с большим диапазоном и не может преобразовать тип данных с большим диапазоном в тип данных с меньшим диапазоном;
- Явное преобразование может привести к потере данных или снижению точности, поэтому требуется проверка совместимости типов данных;
- Для преобразования объектных типов требуются проверки совместимости преобразования типов и проверки безопасности преобразования типов.
Методы преобразования типов
C# предоставляет различные методы преобразования типов, такие как класс Convert, метод Parse и метод TryParse, которые помогают обрабатывать преобразования между разными типами данных.
Использование класса Convert
Класс Convert предоставляет набор статических методов, которые могут выполнять преобразование между различными базовыми типами данных.
Пример
int num = Convert.ToInt32(str);
Использование метода Parse
Метод Parse используется для преобразования строки в соответствующий числовой тип, и он создает исключение, если преобразование не удалось.
Пример
double d = double.Parse(str);
Использование метода TryParse
Метод TryParse похож на Parse, но он не вызывает исключение; вместо этого он возвращает логическое значение, указывающее, успешно ли выполнено преобразование.
Пример
double d;
bool success = double.TryParse(str, out d);
if (success) {
Console.WriteLine("Преобразование успешно: " + d);
} else {
Console.WriteLine("Преобразование не удалось");
}
Пользовательское преобразование типов
C# также позволяет определять пользовательские операции преобразования типов, определяя ключевое слово implicit или explicit в типе.
Пример
public class Fahrenheit
{
public double Degrees { get; set; }
public Fahrenheit(double degrees)
{
Degrees = degrees;
}
// Неявное преобразование из Fahrenheit в double
public static implicit operator double(Fahrenheit f)
{
return f.Degrees;
}
// Явное преобразование из double в Fahrenheit
public static explicit operator Fahrenheit(double d)
{
return new Fahrenheit(d);
}
}
public class Program
{
public static void Main()
{
Fahrenheit f = new Fahrenheit(98.6);
Console.WriteLine("Объект Fahrenheit: " + f.Degrees + " degrees");
double temp = f; // Неявное преобразование
Console.WriteLine("После неявного преобразования в double: " + temp + " degrees");
Fahrenheit newF = (Fahrenheit)temp; // Явное преобразование
Console.WriteLine("После явного преобразования обратно в Fahrenheit: " + newF.Градусы + " градусов");
}
}
В приведенном выше примере мы определили класс Fahrenheit и реализовали неявное преобразование из Fahrenheit в double и явное преобразование из double в Fahrenheit.
Результат вывода будет отображаться следующим образом:
Fahrenheit object: 98.6 degrees After implicit conversion to double: 98.6 degrees After explicit conversion back to Fahrenheit: 98.6 degrees
Итог
В C# встроенные методы преобразования типов в основном реализуются следующими способами: неявное преобразование, явное преобразование (принудительное преобразование), методы с использованием класса Convert, метод Parse и метод TryParse. Эти методы широко используются для преобразования между различными типами данных.
Ниже приведена таблица встроенных методов преобразования типов C#:
| Категория метода | Методы | Описание |
|---|---|---|
| Неявное преобразование | Автоматическое преобразование | Явное указание не требуется; обычно используется для безопасных преобразований типов, например из меньшего типа в больший. |
| Явное преобразование (приведение) | (type)value | Требуется явное указание; обычно используется в случаях, которые могут привести к потере данных или сбою преобразования. |
ConvertМетоды класса | Convert.ToBoolean(value) | Преобразует указанный тип вBoolean |
Convert.ToByte(value) | Преобразует указанный тип вByte | |
Convert.ToChar(value) | Преобразует указанный тип вChar | |
Convert.ToDateTime(value) | Преобразует указанный тип вDateTime | |
Convert.ToDecimal(value) | Преобразует указанный тип вDecimal | |
Convert.ToDouble(value) | Преобразует указанный тип вDouble | |
Convert.ToInt16(value) | Преобразует указанный тип вInt16(короткое целое число) | |
Convert.ToInt32(value) | Преобразует указанный тип вInt32(целое число) | |
Convert.ToInt64(value) | Преобразует указанный тип вInt64(длинное целое число) | |
Convert.ToSByte(value) | Преобразует указанный тип вSByte | |
Convert.ToSingle(value) | Преобразует указанный тип вSingle(тип с плавающей запятой одинарной точности) | |
Convert.ToString(value) | Преобразует указанный тип вString | |
Convert.ToUInt16(value) | Преобразует указанный тип вUInt16(тип беззнакового короткого целого) | |
Convert.ToUInt32(value) | Преобразует указанный тип вUInt32(беззнаковое целое) | |
Convert.ToUInt64(value) | Преобразует указанный тип вUInt64(тип беззнакового длинного целого) | |
ParseМетоды | Boolean.Parse(string) | Разобрать строку какBoolean |
Byte.Parse(string) | Разобрать строку какByte | |
Char.Parse(string) | Разобрать строку какChar | |
DateTime.Parse(string) | Разобрать строку какDateTime | |
Decimal.Parse(string) | Разобрать строку какDecimal | |
Double.Parse(string) | Разобрать строку какDouble | |
Int16.Parse(string) | Разобрать строку какInt16 | |
Int32.Parse(string) | Разобрать строку какInt32 | |
Int64.Parse(string) | Разобрать строку какInt64 | |
SByte.Parse(string) | Разобрать строку какSByte | |
Single.Parse(string) | Разобрать строку какSingle | |
UInt16.Parse(string) | Разобрать строку какUInt16 | |
UInt32.Parse(string) | Разобрать строку какUInt32 | |
UInt64.Parse(string) | Разобрать строку какUInt64 | |
TryParseМетоды | Boolean.TryParse(string, out bool) | Попытаться разобрать строку какBoolean, возвращает логическое значение, указывающее, удалось ли это |
Byte.TryParse(string, out byte) | Попытаться разобрать строку какByte, возвращает логическое значение, указывающее, удалось ли это | |
Char.TryParse(string, out char) | Попытаться разобрать строку какChar, возвращает логическое значение, указывающее, удалось ли это | |
DateTime.TryParse(string, out DateTime) | Попытаться разобрать строку какDateTime, возвращает логическое значение, указывающее, удалось ли это | |
Decimal.TryParse(string, out decimal) | Попытаться разобрать строку какDecimal, возвращает логическое значение, указывающее, удалось ли это | |
Double.TryParse(string, out double) | Попытаться разобрать строку какDouble, возвращает логическое значение, указывающее, удалось ли это | |
Int16.TryParse(string, out short) | Попытаться разобрать строку какInt16, возвращает логическое значение, указывающее, удалось ли это | |
Int32.TryParse(string, out int) | Попытаться разобрать строку какInt32, возвращает логическое значение, указывающее, удалось ли это | |
Int64.TryParse(string, out long) | Попытаться разобрать строку какInt64, возвращает логическое значение, указывающее, удалось ли это | |
SByte.TryParse(string, out sbyte) | Попытаться разобрать строку какSByte, возвращает логическое значение, указывающее, удалось ли это | |
Single.TryParse(string, out float) | Попытаться разобрать строку какSingle, возвращает логическое значение, указывающее, удалось ли это | |
UInt16.TryParse(string, out ushort) | Попытаться разобрать строку какUInt16, возвращает логическое значение, указывающее, удалось ли это | |
UInt32.TryParse(string, out uint) | Попытаться разобрать строку какUInt32, возвращает логическое значение, указывающее, удалось ли это | |
UInt64.TryParse(string, out ulong) | Попытаться разобрать строку какUInt64, возвращает логическое значение, указывающее, удалось ли это |