Типы, характеризуемые значениями и содержащие ссылочные типы
Типы, характеризуемые значениями и содержащие ссылочные типы
Теперь, когда вы чувствуете разницу между типами, характеризуемыми значением, и ссылочными типами, давайте рассмотрим более сложный пример. Предположим, что имеется следующий ссылочный тип (класс), обрабатывающий информационную строку, которую можно установить с помощью пользовательского конструктора.
class ShapeInfo {
public string infoString;
public ShapeInfo(string info) { infoString = info; }
}
Предположим также, что вы хотите поместить переменную этого типа класса в тип с именем MyReсtangle (прямоугольник), характеризуемый значением. Чтобы позволить внешним объектам устанавливать значение внутреннего поля ShapeInfо, вы должны создать новый конструктор (при этом конструктор структуры, заданный по умолчанию, является зарезервированным и не допускает переопределения).
struct MyRectangle {
// Структура MyRectangle содержит член ссылочного типа.
public ShapeInfo reсtInfo;
public int top, left, bottom, right;
public MyRactangle(string info) {
rectInfo = new ShapeInfo(info);
top = left = 10;
bottom = right = 100;
}
}
Теперь вы имеете ссылочный тип. внутри типа, характеризуемого значением. И здесь возникает вопрос на миллион долларов: что случится, если присвоить одну переменную типа MyRectangle другой такой же переменной? С учетом того, что вы уже знаете о типах, характеризуемых значениями, вы можете сделать правильное предположение о том, что целые данные (которые на самом деле и формируют эту структуру) для каждой переменной MyRectangle должны быть независимыми элементами. Но что можно сказать о внутреннем ссылочном типе? Будет скопировано полное состояние этого объекта или будет скопирована ссылка на этот объект? Проанализируйте следующий программный код и рассмотрите рис. 3.14, который может подсказать правильный ответ.
static void Main(string[] args) {
// Создание первого объекта MyRectangle.
Console.WriteLine("-› Создание r1");
MyRectangle r1 = new MyRectangle("Это мой первый прямоугольник");
// Присваивание новому MyRectangle значений r1.
Console.WriteLine("-› Присваивание r1 типу r2");
MyRectangle r2;
r2 = r1;
// Изменение значений r2.
Console.WriteLine("-› Изменение значений r2");
r2.rectInfo.InfoString = "Это новая информация!");
r2.bottom = 4444;
// Print values
Console.WriteLine("-› Значения после изменений:");
Console.WriteLine("-› r1.rectInfo.infoString: {0}", r1.rectInfo.infoString);
Console.WriteLine("-› r2.rectInfo.infoString: {0}", r2.rectInfo.infoString);
Console.WriteLine("-› r1.bottom: {0}", r1.bottom);
Console.WriteLine("-› r2.bottom: {0}", r2.bottom);
}

Рис. 3.14. Внутренние ссылки указывают на один и тот же объект
Как видите, при изменении значения информирующей строки с помощью ссылки r2 ссылка r1 отображает точно такое же значение. По умолчанию, когда тип, характеризуемый значением, содержит ссылочные типы, присваивание приводит к копированию ссылок. В результате вы получаете две независимые структуры, каждая из которых содержит ссылки, указывающие на один и тот же объект в памяти (т.е. "поверхностную копию"). Если вы хотите иметь "детальную копию", когда состояние внутренних ссылок полностью Копируется в новый объект, необходимо реализовать интерфейс ICloneable (это будет обсуждаться в главе 7).
Исходный код. Проект ValAndRef размещен в подкаталоге, соответствующем главе 3.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Типы данных
Типы данных Несмотря на то, что типы данных подробно описаны в документации (см. [1, гл. 4]), необходимо рассмотреть ряд понятий, которые будут часто использоваться в последующих главах книги. Помимо изложения сведений общего характера будут рассмотрены также примеры
Целочисленные типы
Целочисленные типы К целочисленным типам относятся SMALLINT и INTEGER. Надо сказать, что SMALLINT представляет собой урезанную версию INTEGER и имеет длину 2 байта, в отличие от 4 байт, выделяемых для хранения INTEGER. Обычно экономить на дисковом пространстве не следует, и поэтому общей
R.3.6 Типы
R.3.6 Типы Существуют два вида типов: основные и
Типы, характеризуемые значениями, ссылочные типы и оператор присваивания
Типы, характеризуемые значениями, ссылочные типы и оператор присваивания Теперь изучите следующий метод Main() и рассмотрите его вывод, показанный на рис. 3.12.static void Main(string[] args) { Console.WriteLine("*** Типы, характеризуемые значением / Ссылочные типы ***"); Console.WriteLine(-› Создание p1"); MyPoint
Типы, характеризуемые значениями, и ссылочные типы: заключительные замечания
Типы, характеризуемые значениями, и ссылочные типы: заключительные замечания Чтобы завершить обсуждение данной темы, изучите информацию табл. 3.8, в которой приводится краткая сводка основных отличий между типами, характеризуемыми значением, и ссылочными типами.Таблица
Типы ARRAY и SQL
Типы ARRAY и SQL Поскольку в Firebird не существует никакого синтаксиса динамического SQL для обработки типов ARRAY, выполнение DML и поиск таких типов из интерфейсов динамического SQL (DSQL) не является простым делом. API Firebird содержит структуры и функции, позволяющие динамическим
Типы исключений
Типы исключений Может появиться три типа исключений.* Ошибки SQL - т. е. сообщения SQL, имеющие отрицательное значение SQLCODE.* Внутренние ошибки Firebird, которые имеют отношение к конкурирующему взаимодействию, данным, метаданным и условиям окружения. У них есть девяти- символьный
Типы объектов
Типы объектов В титры можно помещать следующие элементы:• надписи (текст, оформленный одним из предопределенных или пользовательским стилем);• графические примитивы (прямоугольник и эллипс);• статические изображения (из графических файлов на диске);• кнопки (правда,
Типы данных
Типы данных Многие языки программирования при объявлении переменной требуют указывать, какой тип данных будет ей присваиваться. Например, в языке Java кодint i = 15;объявит переменную целого типа int с именем i и присвоит ей значение 15. В этом случае тип данных ставится в
2.3 Типы
2.3 Типы Каждое имя (идентификатор) в С++ программе имеет ассоциированный с ним тип. Этот тип определяет, какие операции моно применять к имени (то есть к объекту, на который оно ссылается), и как эти операции интерпретируются. Например:int error number; float real(complex* p);Поскольку error_number
Типы диаграмм
Типы диаграмм Текстовый редактор Word поддерживает возможность построения диаграмм нескольких типов. Изменить тип диаграммы можно, выполнив команду Диаграмма ? Тип диаграммы. В окне Тип диаграммы доступно две вкладки – Стандартные и Нестандартные. В списке Тип выбирают