Поделиться через


Класс System.Convert

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

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

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

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

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

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

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

    • Строка, которую необходимо преобразовать в значение Boolean, не равна Boolean.TrueString и не равна Boolean.FalseString.
    • Строка, преобразованная в 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($"{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
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, или при вызове метода Convert.ToType (таких как Convert.ToInt32(Object) или Convert.ToDouble(Object, IFormatProvider)), и передачи экземпляра пользовательского типа в качестве первого параметра, метод Convert, в свою очередь, вызывает реализацию IConvertible пользовательского типа для выполнения преобразования. Дополнительные сведения см. в разделе "Преобразование типов" в .NET.

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

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

Параметр IFormatProvider может предоставлять культурно-специфические сведения о форматировании, чтобы облегчить процесс преобразования. Однако большинство методов преобразования базового типа его игнорируют. Он используется только следующими методами преобразования базовых типов. null IFormatProvider Если аргумент передан этим методам, используется объект 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, преобразование 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 {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))