Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю - Страница 94
- Предыдущая
- 94/642
- Следующая
Console.WriteLine("Disposed!"); // Экземпляр освобожден! }}Теперь поместите в конце операторов верхнего уровня приведенный ниже код, предназначенный для создания и освобождения новой структуры:
var s = new DisposableRefStruct(50, 60);s.Display();s.Dispose();На заметку! Темы времени жизни и освобождения объектов раскрываются в главе 9.
Чтобы углубить понимание выделения памяти в стеке и куче, необходимо ознакомиться с отличиями между типами значений и ссылочными типами .NET Core.
Типы значений и ссылочные типы
На заметку! В последующем обсуждении типов значений и ссылочных типов предполагается наличие у вас базовых знаний объектно-ориентированного программирования. Если это не так, тогда имеет смысл перейти к чтению раздела "Понятие типов С#, допускающих
nullВ отличие от массивов, строк и перечислений структуры C# не имеют идентично именованного представления в библиотеке .NET Core (т.е. класс вроде
System.StructureSystem.ValueTypeSystem.ValueTypeС точки зрения функциональности единственное назначение класса
System.ValueTypeSystem.ObjectValueTypeSystem.ObjectSystem.ValueTypeSystem.Object// Структуры и перечисления неявно расширяют класс System.ValueType.public abstract class ValueType : object{ public virtual bool Equals(object obj); public virtual int GetHashCode(); public Type GetType(); public virtual string ToString();}Учитывая, что типы значений применяют семантику на основе значений, время жизни структуры (что относится ко всем числовым типам данных (
intfloat// Локальные структуры извлекаются из стека,// когда метод возвращает управление.static void LocalValueTypes(){ // Вспомните, что int - на самом деле структура System.Int32. int i = 0; // Вспомните, что Point - в действительности тип структуры. Point p = new Point();} // Здесь i и р покидают стек!Использование типов значений ссылочных типов и операции присваивания
Когда переменная одного типа значения присваивается переменной другого типа значения, выполняется почленное копирование полей данных. В случае простого типа данных, такого как
System.Int32PointXYFunWithValueAndReferenceTypesPoint// Присваивание двух внутренних типов значений дает// в результате две независимые переменные в стеке.static void ValueTypeAssignment(){ Console.WriteLine("Assigning value types\n"); Point p1 = new Point(10, 10); Point p2 = p1; // Вывести значения обеих переменных Point. p1.Display(); p2.Display(); // Изменить pl.X и снова вывести значения переменных. // Значение р2.Х не изменилось. p1.X = 100; Console.WriteLine("\n=> Changed p1.X\n"); p1.Display(); p2.Display();}Здесь создается переменная типа
Point(p1)Point(р2)PointPointp1.Xр2.X- Предыдущая
- 94/642
- Следующая
