Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю
Классы, объекты и ссылки
Прежде чем приступить к исследованию основных тем главы, важно дополнительно прояснить отличие между классами, объектами и ссылочными переменными. Вспомните, что класс — всего лишь модель, которая описывает то, как экземпляр такого типа будет выглядеть и вести себя в памяти. Разумеется, классы определяются внутри файлов кода (которым по соглашению назначается расширение
*.csCarSimpleGCnamespace SimpleGC{ // Car.cs public class Car { public int CurrentSpeed {get; set;} public string PetName {get; set;} public Car(){} public Car(string name, int speed) { PetName = name; CurrentSpeed = speed; } public override string ToString() => $"{PetName} is going {CurrentSpeed} MPH"; } }}После того как класс определен, в памяти можно размещать любое количество его объектов, применяя ключевое слово new языка С#. Однако следует иметь в виду, что ключевое слово
newusing System;using SimpleGC;Console.WriteLine("***** GC Basics *****");// Создать новый объект Car в управляемой куче.// Возвращается ссылка на этот объект (refToMyCar).Car refToMyCar = new Car("Zippy", 50);// Операция точки (.) используется для обращения к членам// объекта с применением ссылочной переменной.Console.WriteLine(refToMyCar.ToString());Console.ReadLine();На заметку! Вспомните из главы 4, что структуры являются типами значений, которые всегда размещаются прямо в стеке и никогда не попадают в управляемую кучу .NET Core. Размещение в куче происходит только при создании экземпляров классов.

Базовые сведения о времени жизни объектов
При создании приложений C# корректно допускать, что исполняющая среда .NET Core позаботится об управляемой куче без вашего прямого вмешательства. В действительности "золотое правило" по управлению памятью в .NET Core выглядит простым.
Правило. Используя ключевое слово
newПосле создания объект будет автоматически удален сборщиком мусора, когда необходимость в нем отпадет. Конечно, возникает вполне закономерный вопрос о том, каким образом сборщик мусора выясняет, что объект больше не нужен? Краткий (т.е. неполный) ответ можно сформулировать так: сборщик мусора удаляет объект из кучи, только когда он становится недостижимым для любой части кодовой базы. Добавьте в класс
ProgramCarstatic void MakeACar(){ // Если myCar - единственная ссылка на объект Car, то после // завершения этого метода объект Car *может* быть уничтожен. Car myCar = new Car();}Обратите внимание, что ссылка на объект
Car(myCar)MakeACar()ref/outmyCarCarMakeACar()myCarКак вы наверняка сочтете, программирование в среде со сборкой мусора значительно облегчает разработку приложений. И напротив, программистам на языке C++ хорошо известно, что если они не позаботятся о ручном удалении размещенных в куче объектов, тогда утечки памяти не заставят себя долго ждать. На самом деле отслеживание утечек памяти — один из требующих самых больших затрат времени (и утомительных) аспектов программирования в неуправляемых средах. За счет того, что сборщику мусора разрешено взять на себя заботу об уничтожении объектов, обязанности по управлению памятью перекладываются с программистов на исполняющую среду.
Код CIL для ключевого слова new
Когда компилятор C# сталкивается с ключевым словом new, он вставляет в реализацию метода инструкцию
newobjildasm.ехеMakeACar().method assembly hidebysig static void '<<Main>$>g__MakeACar|0_0'() cil managed{ // Code size 8 (0x8)Похожие книги на "Язык программирования C#9 и платформа .NET5", Троелсен Эндрю
Троелсен Эндрю читать все книги автора по порядку
Троелсен Эндрю - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки mir-knigi.info.