Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Теоретический_курс.doc
Скачиваний:
36
Добавлен:
10.11.2019
Размер:
7.68 Mб
Скачать

3.4.6. Преобразование типов данных Преобразование типов данных

1. Виды преобразования типов данных

Поскольку в C# тип определяется статически тип во время компиляции, после объявления переменной, она не может быть объявлена вновь или использоваться для хранения значений другого типа, если этот тип не преобразуется в тип переменной. Например, невозможно преобразование из целого числа в произвольную строку. Поэтому после объявления переменной i как целочисленной, нельзя ей присвоить строку «Hello», как показано в следующем коде:

int i;

i = "Hello"; // Неявное преобразование типа "string" в "int" (ошибка)

Но иногда может быть необходимым скопировать значение в переменную или параметр метода другого типа. Например, может быть переменная, которую требуется передать методу, параметр которого имеет тип double. Или может понадобиться присвоить переменную класса переменной типа интерфейса.Операции такого вида называются преобразованиями типов. В C# можно выполнять следующие виды преобразований:

  • Неявные преобразования. Не требуется никакого специального синтаксиса, поскольку преобразование безопасно для типов и данные не теряются. Примерами могут служить преобразования от меньшего к большему целому типу, и преобразования из производных классов в базовые классы.

  • Явные преобразования (приведения). Для явных преобразований необходим оператор приведения. Приведение требуется, когда при преобразовании может быть потеряна информация, или когда преобразование может завершиться неудачей по другим причинам. К типичным примерам относится числовое преобразование в тип, который имеет меньшую точность или меньший диапазон значений, а также преобразование экземпляра базового класса в производный класс.

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

  • Преобразования с помощью вспомогательных классов. Для преобразования между несовместимыми типами, например целые числа и объекты System.DateTime, или шестнадцатеричные строки и байтовые массивы, можно использовать класс System.BitConverter, класс System.Convert и методы Parse встроенных числовых типов, таких как Int32.Parse. Дополнительные сведения см. в разделах Практическое руководство. Преобразование массива байтов в значение типа int (Руководство по программированию на C#), Практическое руководство. Преобразование строкового значения в значение типа int (Руководство по программированию на C#) и Практическое руководство. Преобразование из шестнадцатеричных строк в числовые типы (Руководство по программированию на C#) (http://msdn.microsoft.com/ru-ru/library/bb384066.aspx, http://msdn.microsoft.com/ru-ru/library/bb397679.aspx и http://msdn.microsoft.com/ru-ru/library/bb311038.aspx).

2.Неявные преобразования

Для встроенных числовых типов неявное преобразование можно выполнить, сохраняемое значение может уместиться в переменной без обрезания или округления до ближайшего. Например, переменная типа long (8-байтное целое) может хранить любое значение, которое может хранить int (4 байта в 32-разрядном компьютере). В следующем примере компилятор неявно преобразует значение справа в тип long перед присвоением его типу bigNum.

int num = 2147483647;

long bigNum = num;

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

Derived d = new Derived();

Base b = d; // OK