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# предлагается очень простой механизм, называемый
// Создание значения типа short.
short s =25;