358
Глава.14 .Символы,.строки.и.обработка.текста
вания типа
Char
в числовое значение, такое как
Int32
, приведение подходит
лучше всего. Кроме того, в некоторых языках (например, в C#) допускается
указывать, какой код должен использоваться при выполеннии преобразования:
проверяемый или непроверяемый (см. главу 5).
Использование типа Convert.
У типа
System.Convert
есть несколько ста-
тических методов,
корректно преобразующих
Char
в числовой тип и обрат-
но. Все эти методы выполняют преобразование как проверяемую операцию,
чтобы в случае потери данных при преобразовании
возникало исключение
OverflowException
.
Использование интерфейса IConvertible.
В типе
Char
и во всех числовых
типах библиотеки .NET Framework Class Library (FCL) реализован интерфейс
IConvertible
, в котором определены такие методы, как
ToUInt16
и
ToChar
. Этот
способ
наименее эффективен, так как вызов интерфейсных методов для число-
вых типов приводит к упаковке экземпляра:
Char
и все числовые типы являются
значимыми типами.
Методы
IConvertible
генерируют исключение
System.
InvalidCastException
, если преобразование невозможно (например, преобразо-
вание типа
Char
в
Boolean
) или грозит потерей данных. Во многих типах (в том
числе
Char
и числовых типах FCL) используются EIMI-реализации методов
IConvertible
(см. главу 13), а
значит, перед вызовом какого-либо метода этого
интерфейса нужно выполнить явное приведение экземпляра к
IConvertible
.
Все
методы
IConvertible
за исключением
GetTypeCode
принимают ссылку
на объект,
реализующий интерфейс
IFormatProvider
. Этот параметр полезен,
когда по какой-либо причине при преобразовании требуется учитывать регио-
нальные стандарты. В большинстве операций преобразования в
этом параметре
передается
null
, потому что он все равно игнорируется.
Применение всех трех способов продемонстрировано в следующем примере:
using System;
public static class Program {
public static void Main() {
Char c;
Int32 n;
// Преобразование "число - символ" посредством приведения типов C#
c = (Char) 65;
Console.WriteLine(c); // Выводится "A"
n = (Int32) c;
Console.WriteLine(n); // Выводится "65"
c = unchecked((Char) (65536 + 65));
Console.WriteLine(c); // Выводится "A"
// Преобразование "число - символ" с помощью типа Convert
359
Тип.System String
c = Convert.ToChar(65);
Console.WriteLine(c); // Выводится "A"
n = Convert.ToInt32(c);
Console.WriteLine(n); // Выводится "65"
// Демонстрация проверки диапазона для Convert
try {
c = Convert.ToChar(70000); // Слишком много для 16 разрядов
Console.WriteLine(c); // Этот вызов выполняться НЕ будет
}
catch (OverflowException) {
Console.WriteLine("Can't convert 70000 to a Char.");
}
// Преобразование "число - символ" с помощью интерфейса IConvertible
c = ((IConvertible) 65).ToChar(null);
Console.WriteLine(c); // Выводится "A"
n = ((IConvertible) c).ToInt32(null);
Console.WriteLine(n); // Выводится "65"
}
}
Do'stlaringiz bilan baham: