Kniga-Online.club
» » » » Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю

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

Читать бесплатно Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю. Жанр: Базы данных год 2004. Так же читаем полные версии (весь текст) онлайн без регистрации и SMS на сайте kniga-online.club или прочесть краткое содержание, предисловие (аннотацию), описание и ознакомиться с отзывами (комментариями) о произведении.
Перейти на страницу:

    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), а также к любому перечислению или структуре) предсказуемо. Когда переменная типа структуры покидает область определения, она немедленно удаляется из памяти:

(window.adrunTag = window.adrunTag || []).push({v: 1, el: 'adrun-4-390', c: 4, b: 390})

// Локальные структуры извлекаются из стека,

// когда метод возвращает управление.

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 typesn");

  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.Xn");

  p1.Display();

  p2.Display();

}

Здесь создается переменная типа Point(p1), которая присваивается другой переменной типа Point(р2). Поскольку Point — тип значения, в стеке находятся две копии Point, каждой из которых можно манипулировать независимым образом. Поэтому при изменении значения p1.X значение р2.X остается незатронутым:

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

Троелсен Эндрю читать все книги автора по порядку

Троелсен Эндрю - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки kniga-online.club.


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

Отзывы читателей о книге Язык программирования C#9 и платформа .NET5, автор: Троелсен Эндрю. Читайте комментарии и мнения людей о произведении.


Уважаемые читатели и просто посетители нашей библиотеки! Просим Вас придерживаться определенных правил при комментировании литературных произведений.

  • 1. Просьба отказаться от дискриминационных высказываний. Мы защищаем право наших читателей свободно выражать свою точку зрения. Вместе с тем мы не терпим агрессии. На сайте запрещено оставлять комментарий, который содержит унизительные высказывания или призывы к насилию по отношению к отдельным лицам или группам людей на основании их расы, этнического происхождения, вероисповедания, недееспособности, пола, возраста, статуса ветерана, касты или сексуальной ориентации.
  • 2. Просьба отказаться от оскорблений, угроз и запугиваний.
  • 3. Просьба отказаться от нецензурной лексики.
  • 4. Просьба вести себя максимально корректно как по отношению к авторам, так и по отношению к другим читателям и их комментариям.

Надеемся на Ваше понимание и благоразумие. С уважением, администратор kniga-online.


Прокомментировать
Подтвердите что вы не робот:*
Подтвердите что вы не робот:*