Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Платформа .NET: основные компоненты в C#.
Средой выполнения люб. программы явл. ОС, которая в свою очередь опирается на аппаратную платформу. Сейчас рынок делят windows, Unix, Linux. После того как Microsoft и SunMicrosystems не поделили межплатформенный язык Java, широко использующийся для создания WAP приложений, в 2001 возникла платформа .NET. Платформа для разработки и исполнения прикладных программ. Платформа – это концепция, спецификация и набор вполне конкретных объектов. Основной идеей .NET Framework стала общая среда исполнения (Common Language Runtime-CLR). Общее для всех приложений .NET в независимости от языка их создания и программно-аппаратной платформы, на которой они должны исполняться. В связи с этим весь код программы разделен на 2 группы: неуправляемые приложения (unmanaged) и управляемые приложения, выполняемые под управлением CLR. Для создания программного кода могут использоваться любые .NET совместимые языки. При компиляции код на этих языках перерабатывается в код на промежуточном языке (Intermediate Language-IL). Данный язык является платформонезависимым. Сущ. возможность писать программы непосредственно на IL. Двоичные файлы, написанные на IL, называются сборками (assembly). Сборка кроме IL кода содержит метаданные (metadata), которые описывают типы, определенные внутри сборки. Кроме этого содержится инфа о всей сборке в целом (версия, ограничения безопасности, список внешних сборок, необходимых для запуска данных). Т.о. каждая сборка сама себя документирует. Сама CLR состоит из 2 компонент: ядро (физически – это файл mscore.dll) и библиотека базовых классов. При запуске какого-либо .NET приложения в память автоматически загружается ядро платформы, и после этого процесс управления приложением целиком передается ядру. Ядро управляет процессом загрузки сборки в память, а так же процессом загрузки других сборок, требующихся для работы данных. После того как сборка загружена выполняется процесс ее окончательной компиляции. Занимается этим компилятор по требованию (Just-In-Time Compiler). Откомпилированные таким образом сборки загружаются в кэш и при повторном обращении будут вызваны оттуда. Дополнительной компиляции не потребуется. Одним из основных преимуществ .NET явл. сильное межъязыковое взаимодействие. Для того, чтобы различные типы правильно воспринимались средой .NET их определения должны соответствовать специально разработанной спецификации, которая называется стандартная система типов (Common Type System-CTS). Она определяет концепции для классов, структур, интерфейсов, перечислений, компонентов типов и делегатов. Так же в CTS предусмотрен ряд встроенных типов, единый для всех языков программирования. Однако не все языки программирования могут работать со всеми встроенными типами. Например, Basic не поддерживает знаковые и беззнаковые типы. в связи с этим был разработан набор правил, соответствие которому гарантирует нормальное межъязыковое взаимодействие (Common Language Specification-CLS). Из этого, однако, не следует, что в классе на C# нельзя перегружать операторы. Просто для CLS совместимости наряду с перегруженным оператором необходим его метод аналог. 20. Механизмы управления памятью в C# В C# для управления памятью используется сборщик мусора - механизм, который позволяет программисту не заботится о ручном освобождении памяти. В .NET используется сборщик мусора, основанный на поколениях. Cборка мусора делится на две стадии: построение графа живых объектов и уплотнение кучи. Если принять во внимание, что большинство объектов – временные, умирающие еще до сборки мусора, то частое уплотнение кучи не является проблемой. Ведь все старые объекты уже уплотнены, а новые в основном вымерли. А что если попытаться отделить новые объекты (ведь именно среди них смертность так велика) от старых? Именно эта идея и привела к разработке сборщика мусора, основанного на поколениях. GC .NET поддерживает три поколения 0, 1 и 2. Поколения 0 и 1 считаются эфемерными. Рождаясь, объекты попадаются в 0 поколение. Большая их часть помирает, не дождавшись первой сборки мусора. Те из них, кто переживает первую в своей жизни сборку мусора, попадают в 1 поколение. 1 поколение – это своего рода отстойник. Оно позволяет отфильтровать объекты, которые не успели умереть к моменту сборки мусора по чистой случайности. 2 поколение – это, можно сказать, дом престарелых. В нем доживают свой немалый век долгожители. Чаще всего мусор собирается в 0 поколении. В прилож., не имеющих комплексов по поводу создания больш. кол-ва объектов, она может производиться по нескольку раз/сек. или раз/ несколько сек. Сборка мусора 1 поколения производится значительно реже. Обычно это происходит раз/несколько мин(в худшем случае – раз/несколько сек) Сборка мусора во 2 поколении происходит крайне редко. Именно сборка этого поколения является самой дорогой. Поколения располагаются друг за другом. Сначала идет 2 поколение. За ним 1, а за ним 0. С каждой сборкой мусора (если, конечно, не складывается ситуация, когда все объекты эфемерных поколений умерли) объекты младших поколений продвигаются в следующее (более старое) покол. Это приводит к сдвижке указателей на начало покол. вперед и вперед. Есть три причины, вызывающих запуск процесса сборки мусора: 1)При очередном выделении памяти GC замечает, что превышен размер нулевого поколения. 2)Приложение самостоятельно вызывает метод GC.Collect(). 3)Нехватка памяти в ОС. 21. Наследование в C# Следует различать 2 вида отношений: HAS-A (отношение «содержит») и IS-A (отношение «является»). Отношение «содержит» - это композиция. Когда объект одного класса содержит один или более объектов других классов. Отношение «является» - это наследование. В этом случае объект типа производного класса явл. так же объектом типа базового класса. Обратное не верно. И наследование и композиция способствуют повторному использованию кодов путем создания новых классов, которые имеют новые черты с существующими классами. В C# для нового класса может быть указанный баз. класс. Это делается в описании класса после его имени. Ставится : и указывается базовый класс. public class First {…} public class Second:First {…} Не указывается тип наследования. В C# нет множественного наследования для классов. У одного производного класса Мб только 1 баз. класс, но 1 баз. класс может иметь несколько производных. Производные классы могут стать базовыми для других классов (если это не запрещено явно). При создании объекта производного класса сначала вызывается конструктор базового класса. Без дополнительных объявлений происходит попытка вызвать конструктор по умолчанию базового класса не зависимо от того, какой конструктор базового класса используется. public class First { public First () {…} public First (int a) {…} } public class Second:First {public Second {…} public Second (int a) {…}} Second s1 = new Second (); Second s2 = new Second (2); Если конструктор по умолчанию у базового класса отсутствует, то возникает ошибка времени компиляции. Можно явно указать, какой конструктор базового класса использовать. Для этого нужно в конструкторе производного класса после заголовка поставить : и записать ключ. слово base? которое заменяет имя конструктора базового класса. public class First {public First (int a) {…}} public class Second:First {public Second():base(7){…} public Second(int a):base(a){…} } В c++ была возможность записи списка инициализации, в C# - нет. Из конструктора класса кроме конструктора базового класса Мб вызван люб. другой конструктор данного класса. По синтаксису такой вызов аналогичен использованию base. Одновременное использование this и base недопустимо. public class First {public First(int a) {…}} public class Second:First {public Second():this(7) {…} public Second(int a):base (a) {…}}
22. Классы, закрытые для наследования в C# В C# существует возможность создать классы наследование от которых невозможно. Делается это при помощи ключевого слова sealed (запечатанный). public sealed class SealedClass {…} Структурные типы данных объявлены sealed неявно, явное бъявление структуры как sealed является ошибкой. 23. Модификатор new в C# В производных классах могут быть определены свои поля, методы, свойства и вложенные типы. При создании объектов производных классов они будут доступны наравне с полями, методами и т.д. базового класса. public class First {public void f1() {…}} public class Second:First {public void f2() {…}} Second s1 = new Second(); s1.f2(); s1.f1(); Иногда может возникнуть необходимость в производном классе переопределять какое-либо поле, метод или вложенное описание типа. public class First {public void f1(){…}} public class Second:First {new public void f1() {…}} В этом случае в производном классе объявление метода происходит с помощью модификатора new. Более того исполь. модификатора new актуально только в тех случаях, если компонент в базовом и производном классе явл. открытым. раммирования клаа - это ми объектов. решаемых задач и требуемой степенью детализации. угих классов.мма. мы; этап Полиморфизм – это когда нечто одно имеет много форм. В программировании - это возможность по интерпретации связанных объектов одинаковым образом с одной стороны и способность динамически вызывать методы объектов классов, основываясь на их типе. В программировании существуют 2 типа полиморфизма: 1) для конкретного случая (ad hoc) – полиморфные объекты никак не связаны с синтаксическими конструкциями. Такой тип полиморфизма используется в ЯП, которые не поддерживают классическое наследование (VB, VB.NET). Полиморфизм достигается за счет объявления у разных классов методов с одинаковой сигнатурой (заголовком). Для реализации такого полиморфизма необходима поддержка позднего связывания. Позднее связывание – тип объектов определяется в момент выполнения программы, в отличие от раннего связывания – тип объекта определяется на этапе компиляции. Иногда используется и динамическое связывание. Пример: Lexus и ВАЗ-2110. 2) Классический полиморфизм м.б. реализован в тех ЯП, которые поддерживают классическое наследование. В этом случае возможности производных классов определяются при описании класса, а затем реализация методов перекрываются в потомках. При этом вариант метода, который будет вызван, определяется автоматическим механизмом. Public class Square { protected int side=2; Public int Area() {return side*side;} Public void Print() {ConsoleWriteline(“S={0}”, Area());} }} Public class Cube:Square {new public int Area() {return 6*side*side;} } Square s = new Square(); S.Print(); Cube c = new Cube(); c.Print();
Результаты: s=4, s=4. Любой вызов функции – передача управления по какому-либо адресу. В функции Print() адрес перехода на функцию Area вычисляется в момент компиляции и естественно, это адрес функции из этого же класса. 25. Виртуальные и не виртуальные методы в C#. Функция объявляется виртуальной в базовом классе с помощью модификатора virtual. Если для производного класса требуется переопределить свой вариант данной функции, то используется ключевое слово override. Синтаксической ошибкой является одновременное использование обоих модификаторов. Ошибкой является одновременное использование модификаторов new и override. Public class Square {protected int side=2; Virtual public int Area(); {return side*side;} Public void Print() {Console.Writeline (“S={0}”, Area());}} Public class Cube:Square {override public int Area() {return 6*side*side;}}} Square S= new Square(); s.Print(); Cube c = new Cube(); c.Print(); Результат: s=4; s=4. Если метод не виртуальный, будет вызван вариант метода, соотв. типу объявленной переменной. Либо типу объекта, к которому приводится данный. Если метод объявлен виртуальным и в потомках переопределен, то вызовется метод, соотв. типу созданного объекта. + Square s1 = new Square(); + Square s2 = new Cube(); - Cube c1 = new Cube(); - Cube c2 = new Square(); Console.Writeline(…); S1.Area() new (4); virtual/override(4) S2.Area() new (4); virtual/override(24) C1.Area() new (24); virtual/override(24) (Square(c1)).Area(); new (4); virtual/override(24) |
Последнее изменение этой страницы: 2019-03-22; Просмотров: 296; Нарушение авторского права страницы