Эндрю Троелсен - ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание
- Название:ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание
- Автор:
- Жанр:
- Издательство:Издательский дом Вильямс
- Год:2007
- Город:Москва • Санкт-Петербург • Киев
- ISBN:ISBN 5-8459-1124-9
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Эндрю Троелсен - ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание краткое содержание
В этой книге содержится описание базовых принципов функционирования платформы .NET, системы типов .NET и различных инструментальных средств разработки, используемых при создании приложений .NET. Представлены базовые возможности языка программирования C# 2005, включая новые синтаксические конструкции, появившиеся с выходом .NET 2.0, а также синтаксис и семантика языка CIL. В книге рассматривается формат сборок .NET, библиотеки базовых классов .NET. файловый ввод-вывод, возможности удаленного доступа, конструкция приложений Windows Forms, доступ к базам данных с помощью ADO.NET, создание Web-приложений ASP.NET и Web-служб XML. Книга содержит множество примеров программного кода, призванного помочь читателю в освоении предлагаемого материала. Программный код примеров можно загрузить с Web-сайта издательства.
ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Передача ссылочных типов по ссылке
Теперь предположим, что у нас есть метод SendAPersonByReference(), который передает ссылочный тип по ссылке (обратите внимание на то, что здесь присутствует модификатор параметра ref).
public static void SendAPersonByReference( refPerson p) {
// Изменение некоторых данных 'р'.
p.age = 122;
// Теперь 'р' указывает на новый объект в динамической памяти!
р = new Person("Никки", 222);
}
Как вы можете догадаться сами, это обеспечивает вызывающей стороне полную гибкость в управлении входными параметрами. Вызывающая сторона не только может изменить состояние объекта, но и переопределить ссылку так, чтобы она указывала на новый тип Person. Рассмотрите следующий вариант.
static void Main(string[] args) {
// Передача ссылочных типов по ссылке.
Console.WriteLine("\n*** Передача объекта Person по ссылке ***");
Person mel = new Person("Мэл", 23);
Console.WriteLine("Person до вызова по ссылке:");
mel.PrintInfo();
SendAPersonByReference(ref mel);
Console.WriteLine("Person после вызова по ссылке:");
mel.PrintInfо();
}
Из рис. 3.16 видно, что тип с именем Мэл возвращается после вызова как тип с именем Никки.

Рис. 3.16. Передача ссылочных типов по ссылке позволяет перенаправить ссылку
Золотым правилом при передаче ссылочных типов по ссылке является следующее.
• Если ссылочный тип передается по ссылке, то вызывающая сторона может изменить не только состояние данных соответствующего объекта, но сам объект ссылки.
Исходный код.Проект RefTypeValTypeParams размещен в подкаталоге, соответствующем главе 3.
Типы, характеризуемые значениями, и ссылочные типы: заключительные замечания
Чтобы завершить обсуждение данной темы, изучите информацию табл. 3.8, в которой приводится краткая сводка основных отличий между типами, характеризуемыми значением, и ссылочными типами.
Таблица 3.8. Сравнение типов, характеризуемых значением, и ссылочных типов
Вопрос | Тип, характеризуемый значением | Ссылочный тип |
---|---|---|
Где размещается тип? | В стеке | В управляемой динамический памяти |
Как представляется переменная? | В виде локальной копии | В виде ссылки на место в памяти, занятое соответствующим экземпляром |
Что является базовым типом? | Оказывается производным от System.ValueType | Может получаться из любого типа, (кроме System.ValueType), не являющегося изолированным (подробности в главе 4) |
Может ли тип быть базовым для других типов? | Нет. Типы, характеризуемые значениями, всегда изолированы и не могут быть расширены | Да. Если тип не изолирован, он может быть базовым для других типов |
Каким является поведение, принятое по умолчанию при передаче параметров? | Переменные передаются по значению (т.е. вызванной функции передается копия переменной) | Переменные передаются по ссылке (например, в вызванную функцию передается адрес переменной) |
Может ли тип переопределить System.Object.Finalize()? | Нет. Типы, характеризуемые значениями, никогда не размещаются в динамической памяти и поэтому не требуют финализации | Да, неявно (подробности в главе 4) |
Можно ли определить конструкторы для этого типа? | Да, но конструктор, заданный по умолчанию, является зарезервированным (т.е., другие конструкторы обязательно должны иметь аргументы) | Безусловно! |
Когда переменные данного типа прекращают свое существование? | Когда они оказываются вне контекста определения | Когда для управляемой динамической памяти выполняется сборка мусора |
Несмотря на указанные отличия, и типы, характеризуемые значением, и ссылочные типы могут реализовывать интерфейсы и поддерживать любое число полей, методов, перегруженных операций, констант, свойств и событий.
Операции создания объектного образа и восстановления из объектного образа
Ввиду того, что в .NET определяются две главные категории типов (характеризуемые значением или ссылкой), может понадобиться представление переменной одной категории в виде переменной другой категории. В C# предлагается очень простой механизм, называемый операцией создания объектного образа (boxing), позволяющий превратить тип, характеризуемый значением, в ссылочный тип. Предположим, что вы создали переменную типа short.
// Создание значения типа short.
short s =25;
Если в приложении потребуется конвертировать этот тип значения в ссылочный тип, вы должны "упаковать" это значение так, как показано ниже.
// "Упаковка" значения в объектную ссылку.
objectobjShort = s;
Операцию создания объектного образа можно формально определить, как процесс явного преобразования типа, характеризуемого значением, в соответствующий ссылочный тип с помощью сохранения переменной в System.Object. Когда значение преобразуется в объектный тип, среда CLR размещает новый объект в динамической памяти и копирует значение соответствующего типа (в данном случае это значение 25) в созданный экземпляр. Вам возвращается ссылка на новый размещенный в памяти объект. При использований такого подхода у разработчика .NET не возникает необходимости использовать интерфейсные классы, чтобы временно обращаться с данными стека как с объектами, размещенными в динамической памяти.
Обратная операция тоже предусмотрена, и называется она восстановлением из объектного образа (unboxing). Восстановление из объектного образа является процессом обратного преобразования значения, содержащегося в объектной ссылке, в значение соответствующего типа, размещаемое в стеке. Операция восстановления из объектного образа начинается с проверки того, что тип данных, в который выполняется восстановление, эквивалентен типу, который был приведён к объекту. Если это так, то выполняется обратное копирование соответствующего значения в локальную переменную в стеке. Например, следующая операция восстановления из объектного образа будет выполнена успешно, поскольку соответствующий тип objShort действительно имеет тип short (операцию преобразования типов в C# мы рассмотрим подробно в следующей главе, а пока что не слишком беспокойтесь о деталях).
// Обратное преобразование ссылки в соответствующее значение short.
short anotherShort = (short)objShort;
Снова обратим ваше внимание на то, что восстановление следует выполнять в соответствующий тип данных. Так, следующая программная логика восстановления из объектного образа генерирует исключение InvalidCastException (обсуждение вопросов обработки исключений содержится в главе 6).
Читать дальшеИнтервал:
Закладка: