Класс System.Convert

В этой статье приводятся дополнительные замечания к справочной документации по этому API.

Статический Convert класс содержит методы, которые в основном используются для поддержки преобразования в базовые типы данных в .NET и из них. Поддерживаемые базовые типы: Boolean, SByteByteInt64UInt16Int32UInt32UInt64Int16CharDoubleDecimalSingleDateTime и .String Кроме того, Convert класс включает методы для поддержки других типов преобразований.

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

Метод преобразования существует для преобразования каждого базового типа в любой другой базовый тип. Однако фактический вызов определенного метода преобразования может привести к одному из пяти результатов в зависимости от значения базового типа во время выполнения и целевого базового типа. Эти пять результатов:

  • Преобразование не выполняется. Это происходит при попытке преобразовать из типа в себя (например, вызывая аргумент Convert.ToInt32(Int32) типа Int32). В этом случае метод просто возвращает экземпляр исходного типа.

  • Объект InvalidCastException. Это происходит, когда конкретное преобразование не поддерживается. Вызывается InvalidCastException для следующих преобразований:

  • FormatException. Это происходит, когда попытка преобразовать строковое значение в любой другой базовый тип завершается ошибкой, так как строка не имеет соответствующего формата. Исключение создается для следующих преобразований:

    • Строка, преобразуемая Boolean в значение, не равна или Boolean.FalseStringне равнаBoolean.TrueString.
    • Строка, преобразованная в Char значение, состоит из нескольких символов.
    • Строка, преобразованная в любой числовый тип, не распознается как допустимое число.
    • Строка, преобразованная в объект, DateTime не распознается как допустимое значение даты и времени.
  • Успешное преобразование. Для преобразования между двумя разными базовыми типами, не перечисленными в предыдущих результатах, все преобразования расширения, а также все сужающие преобразования, которые не приводят к потере данных, будут успешными, и метод вернет значение целевого базового типа.

  • Объект OverflowException. Это происходит, когда сужающее преобразование приводит к потере данных. Например, при попытке преобразовать Int32 экземпляр, значение которого равно 10000 в Byte тип, вызывает OverflowException исключение, так как 10000 находится за пределами Byte диапазона типа данных.

Исключение не будет возникать, если преобразование числового типа приводит к потере точности (т. е. потере некоторых наименее значимых цифр). Однако исключение возникает, если результат больше, чем может быть представлен возвращаемым типом возвращаемого значения метода преобразования.

Например, при преобразовании в Double объект Singleможет возникать потеря точности, но исключение не возникает. Однако если величина слишком велика, Double чтобы быть представлена, Singleсоздается исключение переполнения.

Не десятичные числа

Класс Convert включает статические методы, которые можно вызывать для преобразования целочисленных значений в не десятичные представления строк, а также для преобразования строк, представляющих не десятичные числа в целочисленные значения. Каждый из этих методов преобразования включает аргумент, позволяющий указать числовую base систему; двоичную (базовую 2), восьмеричную (базовую 8) и шестнадцатеричную (базовую 16), а также десятичную (базовую 10). Существует набор методов для преобразования каждого из примитивных целочисленных типов, совместимых с CLS, в строку, и один для преобразования строки в каждый из примитивных целочисленных типов:

  • ToString(Byte, Int32) и ToByte(String, Int32), чтобы преобразовать байтовое значение в строку в указанной базе и из нее.

  • ToString(Int16, Int32) и ToInt16(String, Int32), чтобы преобразовать 16-разрядное целое число со знаком в строку в указанной базе и из нее.

  • ToString(Int32, Int32) и ToInt32(String, Int32), чтобы преобразовать 32-разрядное целое число со знаком в строку в указанной базе и из нее.

  • ToString(Int64, Int32) и ToInt64(String, Int32), чтобы преобразовать 64-разрядное целое число со знаком в строку в указанной базе и из нее.

  • ToSByte(String, Int32), чтобы преобразовать строковое представление байтового значения в указанном формате в подписанный байт.

  • ToUInt16(String, Int32), чтобы преобразовать строковое представление целого числа в указанном формате в 16-разрядное целое число без знака.

  • ToUInt32(String, Int32), чтобы преобразовать строковое представление целого числа в указанном формате в 32-разрядное целое число без знака.

  • ToUInt64(String, Int32), чтобы преобразовать строковое представление целого числа в указанном формате в 64-разрядное целое число без знака.

В следующем примере значение Int16.MaxValue преобразуется в строку во всех поддерживаемых числовых форматах. Затем он преобразует строковое значение обратно в Int16 значение.

using System;

public class Example
{
   public static void Main()
   {
      int[] baseValues = { 2, 8, 10, 16 };
      short value = Int16.MaxValue;
      foreach (var baseValue in baseValues) {
         String s = Convert.ToString(value, baseValue);
         short value2 = Convert.ToInt16(s, baseValue);

         Console.WriteLine("{0} --> {1} (base {2}) --> {3}",
                           value, s, baseValue, value2);
      }
   }
}
// The example displays the following output:
//     32767 --> 111111111111111 (base 2) --> 32767
//     32767 --> 77777 (base 8) --> 32767
//     32767 --> 32767 (base 10) --> 32767
//     32767 --> 7fff (base 16) --> 32767
open System

let baseValues = [ 2; 8; 10; 16 ]
let value = Int16.MaxValue
for baseValue in baseValues do
    let s = Convert.ToString(value, baseValue)
    let value2 = Convert.ToInt16(s, baseValue)
    printfn $"{value} --> {s} (base {baseValue}) --> {value2}"

// The example displays the following output:
//     32767 --> 111111111111111 (base 2) --> 32767
//     32767 --> 77777 (base 8) --> 32767
//     32767 --> 32767 (base 10) --> 32767
//     32767 --> 7fff (base 16) --> 32767
Module Example2
    Public Sub Main()
        Dim baseValues() As Integer = {2, 8, 10, 16}
        Dim value As Short = Int16.MaxValue
        For Each baseValue In baseValues
            Dim s As String = Convert.ToString(value, baseValue)
            Dim value2 As Short = Convert.ToInt16(s, baseValue)

            Console.WriteLine("{0} --> {1} (base {2}) --> {3}",
                           value, s, baseValue, value2)
        Next
    End Sub
End Module
' The example displays the following output:
'     32767 --> 111111111111111 (base 2) --> 32767
'     32767 --> 77777 (base 8) --> 32767
'     32767 --> 32767 (base 10) --> 32767
'     32767 --> 7fff (base 16) --> 32767

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

Помимо поддержки преобразований между базовыми типами, Convert метод поддерживает преобразование любого пользовательского типа в любой базовый тип. Для этого пользовательский тип должен реализовать IConvertible интерфейс, который определяет методы для преобразования типа реализации в каждый из базовых типов. Преобразования, которые не поддерживаются определенным типом, должны вызываться InvalidCastException.

ChangeType При передаче пользовательского типа в качестве первого параметра или при вызове метода Type (например Convert.ToInt32(Object)Convert.ToDouble(Object, IFormatProvider), Convert.Toили вызывается и передается экземпляр пользовательского типа в качестве первого параметра, метод, в свою очередь, Convert вызывает реализацию пользовательского типа IConvertible для выполнения преобразования. Дополнительные сведения см. в разделе "Преобразование типов" в .NET.

Сведения о форматировании, зависящие от языка и региональных параметров

Все методы преобразования базового типа и ChangeType метод включают перегрузки, имеющие параметр типа IFormatProvider. Например, метод Convert.ToBoolean имеет следующие две перегрузки:

Параметр IFormatProvider может предоставлять сведения о форматировании, зависящие от языка и региональных параметров, чтобы помочь процессу преобразования. Однако большинство методов преобразования базового типа игнорируются. Он используется только следующими методами преобразования базовых типов. nullIFormatProvider Если аргумент передается этим методам, CultureInfo используется объект, представляющий текущий язык и региональные параметры.

  • Методы, преобразующие значение в числовой тип. Параметр IFormatProvider используется перегрузкой, которая имеет параметры типа String и IFormatProvider. Он также используется перегрузкой, которая имеет параметры типа Object , и IFormatProvider если тип времени выполнения объекта является типом String.

  • Методы, преобразующие значение в дату и время. Параметр IFormatProvider используется перегрузкой, которая имеет параметры типа String и IFormatProvider. Он также используется перегрузкой, которая имеет параметры типа Object , и IFormatProvider если тип времени выполнения объекта является типом String.

  • Convert.ToString Перегрузки, включающие IFormatProvider параметр и преобразующие числовое значение в строку или DateTime значение в строку.

Однако любой определяемый пользователем тип, реализующий IConvertible параметр, может использовать IFormatProvider этот параметр.

Кодировка Base64

Кодировка Base64 преобразует двоичные данные в строку. Данные, выраженные как цифры base-64, можно легко передавать по каналам данных, которые могут передавать только 7-разрядные символы. Класс Convert включает в себя следующие методы для поддержки кодировки Base64: набор методов поддерживает преобразование массива байтов в массив символов Юникода и из них и из String массива символов Юникода, состоящих из символов базовой-64 цифры.

  • ToBase64String, который преобразует массив байтов в строку в кодировке Base64.
  • ToBase64CharArray, который преобразует массив байтов в массив символов в кодировке Base64.
  • FromBase64String, который преобразует строку в кодировке Base64 в массив байтов.
  • FromBase64CharArray, который преобразует массив символов в кодировке Base64 в массив байтов.

Другие распространенные преобразования

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

  • Преобразование в массивы байтов

    Класс BitConverter предоставляет методы, которые преобразуют примитивные числовые типы (включая Boolean) в массивы байтов и из массивов байтов обратно в примитивные типы данных.

  • Кодировка символов и декодирование

    Класс Encoding и его производные классы (например UnicodeEncoding , и UTF8Encoding) предоставляют методы для кодирования массива символов или строки (то есть для преобразования их в массив байтов в определенной кодировке) и декодирования закодированного массива байтов (т. е. преобразования массива байтов обратно в символы Юникода в кодировке UTF16). Дополнительные сведения см. в разделе "Кодировка символов" в .NET.

Примеры

В следующем примере показаны некоторые методы преобразования в Convert классе, включая ToInt32и ToBooleanToString.

double dNumber = 23.15;

try {
    // Returns 23
    int    iNumber = System.Convert.ToInt32(dNumber);
}
catch (System.OverflowException) {
    System.Console.WriteLine(
                "Overflow in double to int conversion.");
}
// Returns True
bool   bNumber = System.Convert.ToBoolean(dNumber);

// Returns "23.15"
string strNumber = System.Convert.ToString(dNumber);

try {
    // Returns '2'
    char chrNumber = System.Convert.ToChar(strNumber[0]);
}
catch (System.ArgumentNullException) {
    System.Console.WriteLine("String is null");
}
catch (System.FormatException) {
    System.Console.WriteLine("String length is greater than 1.");
}

// System.Console.ReadLine() returns a string and it
// must be converted.
int newInteger = 0;
try {
    System.Console.WriteLine("Enter an integer:");
    newInteger = System.Convert.ToInt32(
                        System.Console.ReadLine());
}
catch (System.ArgumentNullException) {
    System.Console.WriteLine("String is null.");
}
catch (System.FormatException) {
    System.Console.WriteLine("String does not consist of an " +
                    "optional sign followed by a series of digits.");
}
catch (System.OverflowException) {
    System.Console.WriteLine(
    "Overflow in string to int conversion.");
}

System.Console.WriteLine("Your integer as a double is {0}",
                         System.Convert.ToDouble(newInteger));
let dNumber = 23.15

try
    // Returns 23
    Convert.ToInt32 dNumber
    |> ignore
with :? OverflowException ->
    printfn "Overflow in double to int conversion."
// Returns True
let bNumber = System.Convert.ToBoolean dNumber

// Returns "23.15"
let strNumber = System.Convert.ToString dNumber

try
    // Returns '2'
    System.Convert.ToChar strNumber[0]
    |> ignore
with
| :? ArgumentNullException ->
    printfn "String is null"
| :? FormatException ->
    printfn "String length is greater than 1."

// System.Console.ReadLine() returns a string and it
// must be converted.
let newInteger =
    try
        printfn "Enter an integer:"
        System.Convert.ToInt32(Console.ReadLine())
    with
    | :? ArgumentNullException ->
        printfn "String is null."
        0
    | :? FormatException ->
        printfn "String does not consist of an optional sign followed by a series of digits."
        0
    | :? OverflowException ->
        printfn "Overflow in string to int conversion."
        0

printfn $"Your integer as a double is {System.Convert.ToDouble newInteger}"
Dim dNumber As Double
dNumber = 23.15

Try
   ' Returns 23
   Dim iNumber As Integer
   iNumber = System.Convert.ToInt32(dNumber)
Catch exp As System.OverflowException
   System.Console.WriteLine("Overflow in double to int conversion.")
End Try

' Returns True
Dim bNumber As Boolean
bNumber = System.Convert.ToBoolean(dNumber)

' Returns "23.15"
Dim strNumber As String
strNumber = System.Convert.ToString(dNumber)

Try
   ' Returns '2'
   Dim chrNumber As Char
   chrNumber = System.Convert.ToChar(strNumber.Chars(1))
Catch exp As System.ArgumentNullException
   System.Console.WriteLine("String is null.")
Catch exp As System.FormatException
   System.Console.WriteLine("String length is greater than 1.")
End Try

' System.Console.ReadLine() returns a string and it
' must be converted.
Dim newInteger As Integer
newInteger = 0
Try
   System.Console.WriteLine("Enter an integer:")
   newInteger = System.Convert.ToInt32(System.Console.ReadLine())
Catch exp As System.ArgumentNullException
   System.Console.WriteLine("String is null.")
Catch exp As System.FormatException
   System.Console.WriteLine("String does not consist of an " + _
       "optional sign followed by a series of digits.")
Catch exp As System.OverflowException
   System.Console.WriteLine("Overflow in string to int conversion.")
End Try

System.Console.WriteLine("Your integer as a double is {0}", _
                         System.Convert.ToDouble(newInteger))