Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю - Страница 95
- Предыдущая
- 95/642
- Следующая
Assigning value typesX = 10, Y = 10X = 10, Y = 10=> Changed p1.XX = 100, Y = 10X = 10, Y = 10По контрасту с типами значений, когда операция присваивания применяется к переменным ссылочных типов (т.е. экземплярам всех классов), происходит перенаправление на то, на что ссылочная переменная указывает в памяти. В целях иллюстрации создайте новый класс по имени
PointRefPoint// Классы всегда являются ссылочными типами.class PointRef{ // Те же самые члены, что и в структуре Point... // Не забудьте изменить имя конструктора на PointRef! public PointRef(int xPos, int yPos) { X = xPos; Y = yPos; }}Задействуйте готовый тип
PointRefPointRefPointValueTypeAssignment()static void ReferenceTypeAssignment(){ Console.WriteLine("Assigning reference types\n"); PointRef p1 = new PointRef(10, 10); PointRef p2 = p1; // Вывести значения обеих переменных PointRef. p1.Display(); p2.Display(); // Изменить pl.X и снова вывести значения. p1.X = 100; Console.WriteLine("\n=> Changed p1.X\n"); p1.Display(); p2.Display();}В рассматриваемом случае есть две ссылки, указывающие на тот же самый объект в управляемой куче. Таким образом, когда значение
Xp1р2.XAssigning reference typesX = 10, Y = 10X = 10, Y = 10=> Changed p1.XX = 100, Y = 10X = 100, Y = 10Использование типов значений, содержащих ссылочные типы
Теперь, когда вы лучше понимаете базовые отличия между типами значений и ссылочными типами, давайте обратимся к более сложному примеру. Предположим, что имеется следующий ссылочный тип (класс), который поддерживает информационную строку (
InfoStringclass ShapeInfo{ public string InfoString; public ShapeInfo(string info) { InfoString = info; }}Далее представим, что переменная типа
ShapeInfoRectangleRectangleShapeInfoRectanglestruct Rectangle{ // Структура Rectangle содержит член ссылочного типа. public ShapeInfo RectInfo; public int RectTop, RectLeft, RectBottom, RectRight; public Rectangle(string info, int top, int left, int bottom, int right) { RectInfo = new ShapeInfo(info); RectTop = top; RectBottom = bottom; RectLeft = left; RectRight = right; } public void Display() { Console.WriteLine("String = {0}, Top = {1}, Bottom = {2}, " + "Left = {3}, Right = {4}", RectInfo.InfoString, RectTop, RectBottom, RectLeft, RectRight); }}Здесь ссылочный тип содержится внутри типа значения. Возникает важный вопрос: что произойдет в результате присваивания одной переменной типа
RectangleSystem.Int32Rectanglestatic void ValueTypeContainingRefType(){- Предыдущая
- 95/642
- Следующая
