Если в приложении потребуется конвертировать этот тип значения в ссылочный тип, вы должны "упаковать" это значение так, как показано ниже.
// "Упаковка" значения в объектную ссылку.
object objShort = s;
Операцию создания объектного образа можно формально определить, как процесс явного преобразования типа, характеризуемого значением, в соответствующий ссылочный тип с помощью сохранения переменной в System.Object. Когда значение преобразуется в объектный тип, среда CLR размещает новый объект в динамической памяти и копирует значение соответствующего типа (в данном случае это значение 25) в созданный экземпляр. Вам возвращается ссылка на новый размещенный в памяти объект. При использований такого подхода у разработчика .NET не возникает необходимости использовать интерфейсные классы, чтобы временно обращаться с данными стека как с объектами, размещенными в динамической памяти.
Обратная операция тоже предусмотрена, и называется она
// Обратное преобразование ссылки в соответствующее значение short.
short anotherShort = (short)objShort;
Снова обратим ваше внимание на то, что восстановление следует выполнять в соответствующий тип данных. Так, следующая программная логика восстановления из объектного образа генерирует исключение InvalidCastException (обсуждение вопросов обработки исключений содержится в главе 6).
// Некорректное восстановление из объектного образа.
static void Main(string[] args) {
…
try {
// Тип в "yпаковке" - это HE int, a shоrt!
int i = (int)objShort;
} catch(InvalidCastExceptien e) {
Console.WriteLine("ОЙ!\n{0} ", e.ToString());
}
}
Примеры создания объектных образов и восстановления значений
Вы, наверное, спросите, когда действительно бывает необходимо вручную выполнять преобразование в объектный тип (или восстановление из объектного образа)? Предыдущий пример был исключительно иллюстративным, поскольку в нем для данных short не было никакой реальной необходимости приведении к объектному типу (с последующим восстановлением данных из объектного образа).
Реальность такова, что необходимость вручную приводить данные к объектному типу возникает очень редко – если возникает вообще. В большинстве случаев компилятор C# выполняет такие преобразования автоматически. Например, при передаче типа, характеризуемого значением, методу, предполагающему получение объектного параметра, автоматически "в фоновом режиме" происходит приведение к объектному типу.
class Program {
static void Main(string[] args) {
// Создание значения int (тип, характеризуемый значением).
int myInt = 99;
// myInt передается методу, предполагающему
// получение объекта, поэтому myInt приводится
// к объектному типу автоматически.
UseThisObject(myInt);
Console.ReadLine();
}
static void UseThisObject(object o) {
Console.WriteLine("Значением о является: {0}", о);}
}
Автоматическое преобразование в объектный тип происходит и при работе c типами библиотек базовых классов .NET. Например, пространство имен System.Collections (формально оно будет обсуждаться в главе 7) определяет тип класса с именем ArrayList. Подобно большинству других типов коллекций, ArrayList имеет члены, позволяющие вставлять, получать и удалять элементы.