Чтение онлайн

на главную - закладки

Жанры

Язык программирования C#9 и платформа .NET5
Шрифт:

Ниже перечислены дополнительные ограничения структур

ref
:

• их нельзя присваивать переменной типа

object
или
dynamic
, и они не могут быть интерфейсного типа;

• они не могут реализовывать интерфейсы;

• они не могут использоваться в качестве свойства структуры, не являющейся

ref
;

• они не могут применяться в асинхронных методах, итераторах, лямбда-выражениях или локальных функциях.

Показанный далее код, в котором создается простая структура и затем предпринимается попытка создать в этой структуре свойство, типизированное как структура

ref
, не скомпилируется;

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

{

// Вспомните, что int - на самом деле структура System.Int32.

int i = 0;

// Вспомните, что Point - в действительности тип структуры.

Point p = new Point;

} // Здесь i и р покидают стек!

Использование типов значений ссылочных типов и операции присваивания

Когда переменная одного типа значения присваивается переменной другого типа значения, выполняется почленное копирование полей данных. В случае простого типа данных, такого как

System.Int32
, единственным копируемым членом будет числовое значение. Однако для типа
Point
в новую переменную структуры будут копироваться значения полей
X
и
Y
. В целях демонстрации создайте новый проект консольного приложения по имени
FunWithValueAndReferenceTypes
и скопируйте предыдущее определение
Point
в новое пространство имен, после чего добавьте к операторам верхнего уровня следующую локальную функцию:

Поделиться:
Популярные книги

Безымянный раб [Другая редакция]

Зыков Виталий Валерьевич
1. Дорога домой
Фантастика:
боевая фантастика
9.41
рейтинг книги
Безымянный раб [Другая редакция]

Измена. Свадьба дракона

Белова Екатерина
Любовные романы:
любовно-фантастические романы
эро литература
5.00
рейтинг книги
Измена. Свадьба дракона

Не грози Дубровскому! Том VIII

Панарин Антон
8. РОС: Не грози Дубровскому!
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Не грози Дубровскому! Том VIII

Последняя Арена 7

Греков Сергей
7. Последняя Арена
Фантастика:
рпг
постапокалипсис
5.00
рейтинг книги
Последняя Арена 7

На границе империй. Том 9. Часть 3

INDIGO
16. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 9. Часть 3

Все не так, как кажется

Юнина Наталья
Любовные романы:
современные любовные романы
7.70
рейтинг книги
Все не так, как кажется

Я же бать, или Как найти мать

Юнина Наталья
Любовные романы:
современные любовные романы
6.44
рейтинг книги
Я же бать, или Как найти мать

Боярышня Дуняша

Меллер Юлия Викторовна
1. Боярышня
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Боярышня Дуняша

Аромат невинности

Вудворт Франциска
Любовные романы:
любовно-фантастические романы
эро литература
9.23
рейтинг книги
Аромат невинности

Кодекс Крови. Книга IХ

Борзых М.
9. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга IХ

Свет во мраке

Михайлов Дем Алексеевич
8. Изгой
Фантастика:
фэнтези
7.30
рейтинг книги
Свет во мраке

Приручитель женщин-монстров. Том 3

Дорничев Дмитрий
3. Покемоны? Какие покемоны?
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Приручитель женщин-монстров. Том 3

Жестокая свадьба

Тоцка Тала
Любовные романы:
современные любовные романы
4.87
рейтинг книги
Жестокая свадьба

Безродный

Коган Мстислав Константинович
1. Игра не для слабых
Фантастика:
боевая фантастика
альтернативная история
6.67
рейтинг книги
Безродный