Язык программирования 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.Structure
System.ValueType
System.ValueType
С точки зрения функциональности единственное назначение класса
System.ValueType
System.Object
ValueType
System.Object
System.ValueType
System.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();
}
Учитывая, что типы значений применяют семантику на основе значений, время жизни структуры (что относится ко всем числовым типам данных (
int
float
// Локальные структуры извлекаются из стека,
// когда метод возвращает управление.
static void LocalValueTypes()
{
// Вспомните, что int - на самом деле структура System.Int32.
int i = 0;
// Вспомните, что Point - в действительности тип структуры.
Point p = new Point();
} // Здесь i и р покидают стек!
Использование типов значений ссылочных типов и операции присваивания
Когда переменная одного типа значения присваивается переменной другого типа значения, выполняется почленное копирование полей данных. В случае простого типа данных, такого как
System.Int32
Point
X
Y
FunWithValueAndReferenceTypes
Point
// Присваивание двух внутренних типов значений дает
// в результате две независимые переменные в стеке.
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)
Point
Point
p1.X
р2.X
- Предыдущая
- 94/642
- Следующая