struct NormalPoint
{
// Этот код не скомпилируется.
public PointWithRef PropPointer { get; set; }
}
Модификаторы readonly
и ref
можно сочетать для получения преимуществ и ограничений их обоих.
Использование освобождаемых структур ref (нововведение в версии 8.0)
Как было указано в предыдущем разделе, структуры ref
(и структуры ref
, допускающие только чтение) не могут реализовывать интерфейсы, а потому реализовать IDisposable
нельзя. В версии C# 8.0 появилась возможность делать структуры ref
и структуры ref
, допускающие только чтение, освобождаемыми, добавляя открытый метод void Dispose
.
Добавьте в главный файл следующее определение структуры:
ref struct DisposableRefStruct
{
public int X;
public readonly int Y;
public readonly void Display
{
Console.WriteLine($"X = {X}, Y = {Y}");
}
// Специальный конструктор.
public DisposableRefStruct(int xPos, int yPos)
{
X = xPos;
Y = yPos;
Console.WriteLine("Created!"); // Экземпляр создан!
}
public void Dispose
{
// Выполнить здесь очистку любых ресурсов.
Console.WriteLine("Disposed!"); // Экземпляр освобожден!
}
}
Теперь поместите в конце операторов верхнего уровня приведенный ниже код, предназначенный для создания и освобождения новой структуры:
var s = new DisposableRefStruct(50, 60);
s.Display;
s.Dispose;
На заметку! Темы времени жизни и освобождения объектов раскрываются в главе 9.
Чтобы углубить понимание выделения памяти в стеке и куче, необходимо ознакомиться с отличиями между типами значений и ссылочными типами .NET Core.
Типы значений и ссылочные типы
На заметку! В последующем обсуждении типов значений и ссылочных типов предполагается наличие у вас базовых знаний объектно-ориентированного программирования. Если это не так, тогда имеет смысл перейти к чтению раздела "Понятие типов С#, допускающих null
" далее в главе и возвратиться к настоящему разделу после изучения глав 5 и 6.
В отличие от массивов, строк и перечислений структуры C# не имеют идентично именованного представления в библиотеке .NET Core (т.е. класс вроде System.Structure
отсутствует), но они являются неявно производными от абстрактного класса System.ValueType
. Роль класса System.ValueType
заключается в обеспечении размещения экземпляра производного типа (например, любой структуры) в стеке, а не в куче с автоматической сборкой мусора. Выражаясь просто, данные, размещаемые в стеке, могут создаваться и уничтожаться быстро, т.к. время их жизни определяется областью видимости, в которой они объявлены. С другой стороны, данные, размещаемые в куче, отслеживаются сборщиком мусора .NET Core и имеют время жизни, которое определяется многими факторами, объясняемыми в главе 9.
С точки зрения функциональности единственное назначение класса 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
{
Бьерн Страуструп , Бьёрн Страуструп , Валерий Федорович Альмухаметов , Ирина Сергеевна Козлова
Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT