Читаем Язык программирования C#9 и платформа .NET5 полностью

struct NormalPoint

{

  // Этот код не скомпилируется.

  public PointWithRef PropPointer { get; set; }

}

Модификаторы readonly и ref можно сочетать для получения преимуществ и ограничений их обоих.

<p id="AutBody_Root177">Использование освобождаемых структур ref (нововведение в версии 8.0)</p>

Как было указано в предыдущем разделе, структуры 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.

<p id="AutBody_Root178">Типы значений и ссылочные типы</p>

На заметку! В последующем обсуждении типов значений и ссылочных типов предполагается наличие у вас базовых знаний объектно-ориентированного программирования. Если это не так, тогда имеет смысл перейти к чтению раздела "Понятие типов С#, допускающих 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

{

Перейти на страницу:

Похожие книги

97 этюдов для архитекторов программных систем
97 этюдов для архитекторов программных систем

Успешная карьера архитектора программного обеспечения требует хорошего владения как технической, так и деловой сторонами вопросов, связанных с проектированием архитектуры. В этой необычной книге ведущие архитекторы ПО со всего света обсуждают важные принципы разработки, выходящие далеко за пределы чисто технических вопросов.?Архитектор ПО выполняет роль посредника между командой разработчиков и бизнес-руководством компании, поэтому чтобы добиться успеха в этой профессии, необходимо не только овладеть различными технологиями, но и обеспечить работу над проектом в соответствии с бизнес-целями. В книге более 50 архитекторов рассказывают о том, что считают самым важным в своей работе, дают советы, как организовать общение с другими участниками проекта, как снизить сложность архитектуры, как оказывать поддержку разработчикам. Они щедро делятся множеством полезных идей и приемов, которые вынесли из своего многолетнего опыта. Авторы надеются, что книга станет источником вдохновения и руководством к действию для многих профессиональных программистов.

Билл де Ора , Майкл Хайгард , Нил Форд

Программирование, программы, базы данных / Базы данных / Программирование / Книги по IT
Программирование. Принципы и практика использования C++ Исправленное издание
Программирование. Принципы и практика использования C++ Исправленное издание

Специальное издание самой читаемой и содержащей наиболее достоверные сведения книги по C++. Книга написана Бьярне Страуструпом — автором языка программирования C++ — и является каноническим изложением возможностей этого языка. Помимо подробного описания собственно языка, на страницах книги вы найдете доказавшие свою эффективность подходы к решению разнообразных задач проектирования и программирования. Многочисленные примеры демонстрируют как хороший стиль программирования на С-совместимом ядре C++, так и современный -ориентированный подход к созданию программных продуктов. Третье издание бестселлера было существенно переработано автором. Результатом этой переработки стала большая доступность книги для новичков. В то же время, текст обогатился сведениями и методиками программирования, которые могут оказаться полезными даже для многоопытных специалистов по C++. Не обойдены вниманием и нововведения языка: стандартная библиотека шаблонов (STL), пространства имен (namespaces), механизм идентификации типов во время выполнения (RTTI), явные приведения типов (cast-операторы) и другие. Настоящее специальное издание отличается от третьего добавлением двух новых приложений (посвященных локализации и безопасной обработке исключений средствами стандартной библиотеки), довольно многочисленными уточнениями в остальном тексте, а также исправлением множества опечаток. Книга адресована программистам, использующим в своей повседневной работе C++. Она также будет полезна преподавателям, студентам и всем, кто хочет ознакомиться с описанием языка «из первых рук».

Бьерн Страуструп , Бьёрн Страуструп , Валерий Федорович Альмухаметов , Ирина Сергеевна Козлова

Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT