C# Преобразование типов

В C# преобразование типов — это процесс преобразования значения одного типа данных в другой тип данных.

Преобразование типов в C# можно разделить на два типа:Неявное преобразование типовиЯвное преобразование типов(также известное как принудительное преобразование типов).

Неявное преобразование типов

Неявное преобразование — это преобразование, которое не требует написания кода для его указания; компилятор выполняет его автоматически.

Неявное преобразование означает, что при преобразовании типа данных с меньшим диапазоном в тип данных с большим диапазоном компилятор автоматически выполняет преобразование типов. Эти преобразования являются преобразованиями C# по умолчанию, выполняемыми безопасным образом, и не приводят к потере данных.

Например, из int в long, из float в double и т. д.

Преобразование из меньшего целочисленного типа в больший целочисленный тип или из производного класса в базовый класс. При присваивании переменной типа byte переменной типа int компилятор автоматически преобразует тип byte в тип int без необходимости явного преобразования.

Пример

байт b = 10;
int i = b; // Неявное преобразование, явное преобразование не требуется

Присваивание целого числа длинному целому числу или присваивание числа с плавающей запятой числу с плавающей запятой двойной точности — такой вид преобразования не приводит к потере данных:

Пример

int intValue = 42;
long longValue = intValue; // Неявное преобразование из int в long

Явное преобразование

Явное преобразование типа, также известное как принудительное преобразование типа, требует, чтобы программист явно указал его в коде.

Явное преобразование означает, что при преобразовании типа данных с большим диапазоном в тип данных с меньшим диапазоном или при преобразовании одного объектного типа в другой объектный тип для явного преобразования требуется оператор приведения. Принудительное преобразование может привести к потере данных.

Например, присваивание переменной типа int переменной типа byte требует явного преобразования.

Пример

int i = 10;
byte b = (byte)i; // Явное преобразование, требуется оператор приведения

Приведение к целочисленному типу:

Пример

double doubleValue = 3.14;
int intValue = (int)doubleValue; // Принудительное приведение double к int; данные могут потерять дробную часть

Приведение к типу с плавающей запятой:

Пример

int intValue = 42;
float floatValue = (float)intValue; // Принудительное преобразование из int в float, данные могут потерять точность

Приведение к строковому типу:

Пример

int intValue = 123;
string stringValue = intValue.ToString(); // Преобразование int в string

В следующем примере демонстрируется явное преобразование типа:

Пример

using System;

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# предоставляет следующие встроенные методы преобразования типов:

Порядковый номерМетод и описание
1ToBoolean
Преобразовать тип в логическое значение, если это возможно.
2ToByte
Преобразует тип в тип byte.
3ToChar
Преобразовать тип в тип одиночного символа Unicode, если это возможно.
4ToDateTime
Преобразовать тип (целочисленный или строковый тип) в структуру даты и времени.
5ToDecimal
Преобразовать тип с плавающей запятой или целочисленный тип в десятичный тип.
6ToDouble
Преобразует тип в тип с плавающей запятой двойной точности.
7ToInt16
Преобразовать тип в 16-битный целочисленный тип.
8ToInt32
Преобразовать тип в 32-битный целочисленный тип.
9ToInt64
Преобразовать тип в 64-битный целочисленный тип.
10ToSbyte
Преобразует тип в знаковый байтовый тип.
11ToSingle
Преобразует тип в тип числа с плавающей запятой малой точности.
12ToString
Преобразует тип в строковый тип.
13ToType
Преобразует тип в указанный тип.
14ToUInt16
Преобразует тип в 16-битный целочисленный тип без знака.
15ToUInt32
Преобразует тип в 32-битный целочисленный тип без знака.
16ToUInt64
Преобразует тип в 64-битный целочисленный тип без знака.

Все эти методы определены в классе System.Convert, и при их использовании необходимо включить пространство имен System. Они обеспечивают безопасный способ выполнения преобразования типов, так как могут обрабатывать значения null и вызовут исключение, если преобразование невозможно.

Например, использование метода Convert.ToInt32 для преобразования строки в целое число:

string str = "123";
int number = Convert.ToInt32(str); // 转换成功,number为123

Если строка не является допустимым представлением целого числа, Convert.ToInt32 вызовет исключение FormatException.

В следующем примере типы различных значений преобразуются в строковые типы:

Пример

using System;

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 предоставляет набор статических методов, которые могут выполнять преобразование между различными базовыми типами данных.

Пример

string str = "123";
int num = Convert.ToInt32(str);

Использование метода Parse

Метод Parse используется для преобразования строки в соответствующий числовой тип, и он создает исключение, если преобразование не удалось.

Пример

string str = "123.45";
double d = double.Parse(str);

Использование метода TryParse

Метод TryParse похож на Parse, но он не вызывает исключение; вместо этого он возвращает логическое значение, указывающее, успешно ли выполнено преобразование.

Пример

string str = "123.45";
double d;
bool success = double.TryParse(str, out d);

if (success) {
    Console.WriteLine("Преобразование успешно: " + d);
} else {
    Console.WriteLine("Преобразование не удалось");
}

Пользовательское преобразование типов

C# также позволяет определять пользовательские операции преобразования типов, определяя ключевое слово implicit или explicit в типе.

Пример

using System;

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, возвращает логическое значение, указывающее, удалось ли это
Другие расширения