Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

NET Framework. Механизм сборки мусора.




Сборка мусора - одна из форм автоматического управления памятью. Специальный код, называемый сборщиком мусора (garbage collector), периодически освобождает память, удаляя объекты, которые уже не будут востребованы приложением — то есть производит сборку мусора.

Сборка мусора – метод освобождения динамической памяти путем автоматического удаления объектов в случае отсутствия ссылок на них

 занимает время

 недетерминирована (выполняется по инициативе CLR, а не приложения)

 существует механизм принудительной сборки мусора

Деструктор – метод, вызывающийся CLR непосредственно перед уничтожением

объекта сборщиком мусора

 синтаксис:

~ имя_класса ()

{ тело }

 нельзя предсказать, когда будет выполнен деструктор

Начиная работу, сборщик предполагает, что все объекты в куче — мусор. Ина­че говоря, он предполагает, что в стеке потока нет переменных, ссылающихся на объекты в куче, а также что на объекты в куче не ссылаются регистры процессо­ра и статические поля. Затем сборщик переходит к этапу сбора мусора, называе­мому маркировка (marking). Он проходит по стеку потока и проверяет вес кор­ни. Если окажется, что корень ссылается на объект, в поле SyncBlocklndex этого объекта будет включен бит — именно так объект маркируется. Например, сбор­щик мусора может найти локальную переменную, указывающую на объект в куче. На рис. 20-3 показана куча с несколькими объектами, в которой корни приложе­ния напрямую ссылаются на объекты А, С D и F. Все эти объекты маркируются. При маркировке объекта D сборщик мусора замечает, что в этом объекте есть поле, ссылающееся на объект Н. Поэтому объект Н также помечается. Затем сборщик продолжает рекурсивный просмотр всех достижимых объектов,

После маркировки корня и объекта, на который ссылается его поле, сборщик мусора проверяет следующий корень и продолжает маркировать объекты. При попытке пометить объект, уже помеченный ранее, сборщик мусора останавлива­ется. Это нужно по двум причинам. Во-первых, заметно повышается быстродействие, так как сборщик проходит набор объектов не больше одного раза, а во-вторых, исключается возможность бесконечных циклов, возникающих из-за зам­кнутых связных списков объектов.

C#. Объявление класса.

Объявление класса в языке C# создает новый ссылочный тип, дающий возможность программисту моделировать объекты (элементы данные) и которым присуще определённое поведение (методы).

доступ class имя_класса

{

// члены класса

}

Пример:

public class Complex

{... }

Каждый класс в C# автоматически снабжается типовым конструктором, который вы можете при необходимости переопределить. Этот типовой конструктор используется по умолчанию и гарантирует что все члены-данные по умолчанию получат типовые входные значения. Конструктор имеет имя, соответствующее имени класса и он никогда не возвращает значения.

 

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

доступ модификатор тип имя = значение;

public static int MaxSize = 10;

private int x = 7;

  • static – поле связано с типом, а не с каким-либо конкретным объектом
  • readonly – запись в поле разрешается только из кода конструктора

Определение метода

доступ модификатор тип_возврата имя_метода(параметры)

{

тело_метода

}

 

 

C#. Делегаты. События.

Делегат – тип, поддерживающий механизм функций обратного вызова.

Экземпляры этого типа являются оболочками методов других типов.

 обеспечивают безопасность типов

 поддерживают вызов статических и экземплярных методов

цепочка делегатов — набор делегатов, который позволяет вызвать все методы,

представленные делегатами набора

 

Начнем с определения термина делегат (delegate). Делегат — это объект, который

может ссылаться на метод. Таким образом, создавая делегат, вы по сути создаете объект, который может содержать ссылку на метод. Более того, этот метод можно вызвать

посредством соответствующей ссылки. Таким образом, делегат может вызывать метод,

на который он ссылается.

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

обычно мы имеем дело с ссылками, которые указывают на объекты, но в действительности здесь разница небольшая. Как разъяснялось выше, ссылка по существу

представляет собой адрес памяти. Следовательно, ссылка на объект — это адрес объекта. Даже несмотря на то что метод не является объектом, он тоже имеет отношение к физической области памяти, а адрес его точки входа — это адрес, к которому происходит обращение при вызове метода. Этот адрес можно присвоить делегату. Если уж делегат ссылается на метод, этот метод можно вызвать посредством данного делегата.

Важно понимать, что во время выполнения программы один и тот же делегат можно использовать для вызова различных методов, просто заменив метод, на который ссылается этот делегат. Таким образом, метод, который будет вызван делегатом, определяется не в период компиляции программы, а во время ее работы. В этом и состоит достоинство делегата.

Делегат объявляется с помощью ключевого слова delegate. Общая форма объявления делегата имеет следующий вид:

delegate тип_возврата имя(список_параметров);

 

Здесь элемент тип_возврата представляет собой тип значений, возвращаемых методами, которые этот делегат будет вызывать. Имя делегата указывается элементом имя. Параметры, принимаемые методами, которые вызываются посредством делегата, задаются с помощью элемента список_параметров. Делегат может вызывать только такие методы, у которых тип возвращаемого значения и список параметров (т.е. его сигнатура) совпадают с соответствующими элементами объявления делегата.

Делегат может вызывать либо метод экземпляра класса, связанный с объектом, или

статический метод, связанный с классом.

Примеры:

internal delegate void FooCallback(int value)

public delegate int BarCallback(int [] anArray)

 

Во-первых, делегаты обеспечивают поддержку функционирования событий.

Во-вторых, делегаты позволяют во время выполнения программы выполнить метод,

который точно не известен в период компиляции. Эта возможность особенно полезна, когда нужно создать оболочку, к которой могли бы подключаться программные

компоненты.

 

На основе делегатов построено еще одно важное средство С#: событие (event). Событие — это по сути автоматическое уведомление о выполнении некоторого действия.

События работают следующим образом. Объект, которому необходима информация о

некотором событии, регистрирует обработчик для этого события. Когда ожидаемое

событие происходит, вызываются все зарегистрированные обработчики. А теперь

внимание: обработчики событий представляются делегатами.

События — это члены класса, которые объявляются с использованием ключевого

слова event. Наиболее распространенная форма объявления события имеет следующий вид:

event событийный_делегат объект;

 

Здесь элемент событийный_делегат означает имя делегата, используемого для

поддержки объявляемого события, а элемент объект — это имя создаваемого собы-

тийного объекта.

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

некоторого события Механизм событий основан на делегатах.

Если в типе определен член-событие, то этот тип (или его экземпляр) может

уведомлять другие объекты о некоторых особых событиях. Скажем, класс Button

(«кнопка») определяет событие Click («щелчок»). В приложении могут быть объекты,

которые должны получать уведомление о щелчке объекта Button, а получив такое

уведомление — исполнять некоторые действия. События — это члены типа,

обеспечивающие такого рода взаимодействие. Тип, в котором определены события, как

минимум поддерживает:

 регистрацию статического метода типа или экземплярного метода объекта,

заинтересованных в получении уведомления о событии;

 отмену регистрации статического метода типа или экземплярного метода

объекта, получающих уведомления о событии;

 уведомление зарегистрированных методов о том, что событие произошло.

Типы могут предоставлять эту функциональность при определении событий,

так как они поддерживают список зарегистрированных методов. Когда событие

происходит, тип уведомляет об этом все зарегистрированные методы.

Модель событий CLR основана на делегатах (delegate). Делегаты позволяют

обращаться к методам обратного вызова (callback method), не нарушая

безопасности типов. Метод обратного вызова — это механизм, позволяющий объекту

получать уведомления, на которые он подписался.

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...