Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

CLR работает не с модулями, а со сборками.




Сборка (assembly):

- логическая группировка одного или нескольких управляемых модулей или файлов ресурсов;

- единица повторного использования, безопасности и контроля версий.

 

Манифест, декларация (manifest) – метаданные, описывающие

- файлы, формирующие сборку

- общедоступные типы, реализованные в файлах сборки

- файлы ресурсов или данных, включенные в сборку

 

 

Framework Class Library

- FCL основана на объектно-ориентированной парадигме

- Содержит несколько тысяч типов

- Типы скомпонованы в пространства имен
5. .NET Framework. Общая система типов (CTS) и Общеязыковая спецификация (CLS).

Общая система типов (Common Type System, CTS) – формальная спецификация, описывающая определение типов и их поведение

- Типы (класс, структура, перечисление, интерфейс, делегат)

- Определяет элементы типов: поле, метод, свойство, событие

- Определяет правила видимости типов и доступа к их элементам public, protected, private, internal


Типы

- Ссылочные (reference types)

- Переменная содержит ссылку на объект

- При присваивании создается еще одна ссылка на тот же объект

- Объекты размещаются в управляемой куче

- Типы-значения (value-types)

- Переменная содержит сам объект

- При присваивании создается копия объекта

- Объекты размещаются в стеке

- Элементарные (primitive types)

Видимость типа

- public (открытый)

- internal (внутренний) (тип доступен только из сборки, в которой он определен)

Члены типа

Константа – идентификатор, представляющий некую постоянную величину

Поле

Статическое         Экземплярное

Конструктор экземпляров

Конструктор типа – метод, инициализирующий статические поля типа

Метод

Перегруженный оператор

Оператор преобразования — метод определяющий порядок приведения объекта из одного типа в другой

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

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

Тип – позволяет определить вложенные типы

Доступ к членам типа

private – тип (и вложенные типы)

protected – тип и производные от него

internal – сборка

protected internal – тип, производные от него и любой код в сборке

public – любой код из любой сборки

Общеязыковая спецификация (Common Language Specification, CLS) – спецификация, описывающая набор правил, позволяющих типам, реализованным на разных языках взаимодействовать друг с другом.

- Учет регистра символов

- Целые числа без знака

- Перегрузка операторов

- Методы с переменным числом параметров

Общеязыковая спецификация

- Учет регистра символов

- Целые числа без знака

- Перегрузка операторов

- Методы с переменным числом параметров
6. .NET Framework. Механизм сборки мусора.

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

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

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

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

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

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

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

 синтаксис:

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

{тело}

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

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

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

 

После проверки всех корней куча содержит набор маркированных и немар­кированных объектов. Маркированные объекты, в отличие от немаркированных, достижимы из кода приложения. Недостижимые объекты считаются мусором, а занимаемая ими память становится доступной для освобождения. Затем сборщик переходит к следующему этапу сбора мусора, называемому сжатие (compact phase). Теперь он проходит кучу линейно в поисках непрерывных блоков немаркирован­ных объектов, то есть мусора.

Небольшие блоки сборщик не трогает, а в больших непрерывных блоках он перемещает вниз все «немусорные» объекты, сжимая таким образом кучу.

Естественно, перемещение объектов в памяти делает все переменные и реги­стры процессора, содержащие указатели на объекты, недействительными. Поэтому сборщик мусора должен вновь проверить и обновить все корни приложения, чтобы все значения корней указывали на новые адреса объектов в памяти. Кроме того, если объект содержит поле, указывающее на другой перемещенный объект, сбор­щик должен исправить и эти поля. После сжатия памяти кучи в указатель NextObjPtr управляемой кучи заносится первый адрес за последним объектом, не являющимся мусором. На рис. 20-4 показана управляемая куча после сбора мусора.

Как видите, сбор мусора сильно бьет по производительности — это основной недостаток управляемой кучи. Однако не следует забывать, что сбор мусора на­чинается только после заполнения поколения 0, а до этого управляемая куча ра­ботает намного быстрее, чем куча исполняющей среды С. Наконец, ряд оптими­заций сборщика мусора CLE существенно повышает производительность сбора мусора.

Завершение (finalization) — это механизм, поддерживаемый CLR, который по­зволяет объекту выполнить корректную очистку, прежде чем сборщик мусора освободит занятую им память. Любой тип, выполняющий функцию оболочки машинного ресурса, например файла, сетевого соединения, сокста, мыотекса и других, должен поддерживать завершение. Для этого в типе реализуют метод Finalize. Определив, что объект стал мусором, сборщик вызывает метод Finalize объекта (если он есть). Иначе говоря, если в типе реализован метод Finalize, это означает, что все его объекты имеют право на исполнение «последнего желания перед экзекуцией».




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

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

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

{

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

}

Пример:

public class Complex

{ ... }

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

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

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

public static int MaxSize = 10;

private int x = 7;

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

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

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

{

тело_метода

}



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

 

Класс — это шаблон для создания объекта. Класс определяет структуру объекта и его методы, образующие функциональный интерфейс. В процессе выполнения Java-программы система использует определения классов для создания представителей классов. Представители являются реальными объектами. Термины «представитель», «экземпляр» и «объект» взаимозаменяемы. Ниже приведена общая форма определения класса.

class имя_класса extends имя_суперкласса { type переменная1_объекта:

type переменная2_объекта:

type переменнаяN_объекта:

type имяметода1(список_параметров) { тело метода;

}

type имяметода2(список_параметров) { тело метода;

}

type имя методаМ(список_параметров) { тело метода;

}

}

Ключевое слово extends указывает на то, что «имя_класса» — это подкласс класса «имя_суперкласса». Во главе классовой иерархии Java стоит единственный ее встроенный класс — Object. Если вы хотите создать подкласс непосредственно этого класса, ключевое слово extends и следующее за ним имя суперкласса можно опустить — транслятор включит их в ваше определение автоматически. Примером может служить класс Point.

class Point {

}

 



C#. Делегаты.

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

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

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

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

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

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

 

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

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

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

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

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

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

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

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

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

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

 

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

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

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

Примеры:

internal delegate voidFooCallback(intvalue)

public delegate intBarCallback(int[] anArray)

 

Многоадресатная передача

Одна из самых интересных возможностей делегата — поддержка многоадресатной

передачи (multicasting). Выражаясь простым языком, Многоадресатная передача — это

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

Достаточно создать экземпляр делегата, а затем для добавления методов в эту цепочку

использовать оператор "+=". Для удаления метода из цепочки используется оператор

" - = " . (Можно также для добавления и удаления методов использовать в отдельности

операторы "+", " - " и "=", но чаще применяются составные операторы "+=" и "-=".)

Делегат с многоадресатной передачей имеет одно ограничение: он должен возвращать

тип void.

Назначение делегатов

Несмотря на то что предыдущие примеры программ продемонстрировали, "как"

работают делегаты, они не содержали ответа на вопрос "зачем это нужно?". Так вот,

делегаты используются по двум основным причинам.

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

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

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

компоненты.

Microsoft .NET Framework поддерживает механизм функций обратного вызова при 

помощи делегатов (delegate). Делегаты обеспечивают безопасность типов при выполнении

метода обратного вызова (способствуя решению одной из важнейших задач CLR).

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

 



C#. События.

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

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

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

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

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

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

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

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

 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Проектирование типа, поддерживающего событие:










Последнее изменение этой страницы: 2018-05-27; просмотров: 216.

stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...