Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Экзамен в гаи redacted.doc
Скачиваний:
5
Добавлен:
27.09.2019
Размер:
676.35 Кб
Скачать

Экзаменационный билет №1

1. Структура и принципы функционирования приложений на платформе .Net, библиотека компонентов и классов .Net Framework, исполнительная среде clr.

Microsoft.NET (.NET Framework) – программная платформа. Содержит следующие основные компоненты: the common language runtime (CLR) и the .NET Framework class library (.NET FCL).

CLR (Common Language Runtime) – Среда Времени Выполнения или Виртуальная Машина – управляемая операционная система высокого уровня, которая обеспечивает выполнение программного кода и предполагает решение следующих задач:

  1. управление кодом (загрузку и выполнение),

  2. управление памятью при размещении объектов,

  3. изоляцию памяти приложений,

  4. проверку безопасности кода,

  5. преобразование промежуточного языка в машинный код,

  6. доступ к метаданным (расширенная информация о типах),

  7. обработка исключений, включая межъязыковые исключения,

  8. взаимодействие между управляемым и неуправляемым кодом (в том числе и COM-объектами),

  9. поддержка сервисов для разработки (профилирование, отладка и т.д.).

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

CLR состоит из двух компонент:

  1. ядра (mscoree.dll);

  2. библиотеки базовых классов (mscorlib.dll).

FCL (.NET Framework Class Library) – объектно-ориентированная библиотека классов, интерфейсов и системы типов (типов-значений), которые включаются в состав платформы Microsoft .NET. В частности, содержит:

  1. встроенные (элементарные) типы, представленные в виде классов (на платформе .NET всё построено на структурах или классах);

  2. классы для разработки графического пользовательского интерфейса (Windows Form);

  3. классы для разработки Web-приложений и Web-служб на основе технологии ASP.NET (Web Forms);

  4. классы для разработки XML и Internet-протоколами (FTP, HTTP, SMTP, SOAP);

  5. классы для разработки приложений, работающих с базами данных (ADO.NET).

.NET-приложение – приложение, разработанное для выполнения на платформе Microsoft.NET. Реализуется на языках программирования, соответствующих CLS. Независимо от компилятора(и входного языка) результатом трансляции .NET приложения является управляемый исполняемый модуль (управляемый модуль). Это стандартный переносимый исполняемый(PE – Portable Executable) файл Windows.

2. Интерфейсы. Стандартные интерфейсы .Net. Сравнение и клонирование объектов. Структуры. Делегаты. События.

Интерфейс (interface) — это коллекция общедоступных методов и свойств, которые объединяются вместе для инкапсуляции конкретной функциональности. После опреде­ления интерфейса его можно реализовать в классе. Это означает, что в таком случае класс будет поддерживать все свойства и члены, специфицируемые данным интерфейсом.

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

Один класс может поддерживать несколько интерфейсов, а несколько классов мо­гут поддерживать один и тот же интерфейс.

interface IMylnterface

{

// Члены интерфейса.

}

Наследование интерфейсов тоже задается похожим с классами образом. Главное отличие состоит лишь в том, что в их случае может использоваться несколько базо­вых:

public interface IMylnterface : IMyBaselnterfасе, IMyBaseInterface2

{

// Члены интерфейса.

}

Структура представляет собой набор блоков данных, возможно, разного типа. Структуры определяются с помощью ключевого слова struct:

struct oops

{

<объявления_членов>

}

В разделе <объявления_членов> содержатся объявления переменных(называе­мых данными-членами структуры) в практически том же самом формате, что и обычно. Объявление каждого члена имеет следующий вид:

<уровень_доступа> <тип> <имя>;

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

oops myOops;

Помимо этого, можно обращаться к данным-членам этой сложной переменной с помощью символа точки:

myOops.par1 = “test”;

myOops.par2 = 2.5;

События (events) определяют реакцию класса на те или иные действия пользова­теля (на перемещение мыши, например) или на изменения в работающей про­грамме (например, как реакция на возникновение исключительной ситуации). С событиями связываются делегаты – специальные объекты, которым передает­ся управление при возникновении события. Для объявления события использу­ется зарезервированное слово event, для объявления делегата – delegate.

События являются важными вхождениями, в связи с которыми в других частях кода могут выполняться определенные действия, подобные, но более мощные, чем генерация исключений. Например, может быть необходимо, чтобы при добав­лении объекта Animal в коллекцию Animals выполнялся определенный код, не яв­ляющийся ни частью класса Animals, ни частью того кода, который вызывает метод Add(). Чтобы добиться такого поведения, потребуется добавить в код обработчик со­бытий, представляющий собой функцию особого вида, которая вызывается при воз­никновении события. Кроме того, потребуется также сконфигурировать этот обра­ботчик, чтобы он ожидал поступления именно интересующего события.

Делегат (delegate) – это тип, который позволяет хранить ссылки на функции. Объявляются делегаты во многом так же, как функции, но только безо всякого тела функции и с ключевым словом delegate. В объ­явлении любого делегата указывается возвращаемый тип и список параметров. После определения делегата можно объявлять переменную с типом этого делегата. Далее эту переменную можно инициализировать как ссылку на любую функцию, которая имеет точно такой же возвращаемый тип и список параметров, как и у делегата. После этого функцию можно вызывать с использованием переменной делегата так, будто бы это и есть сама функция.

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

class Program {

delegate double ProcessDelegate(double paraml, double param2);

static double Multiply (double paraml, double param2) {

return paraml * param2 ;

}

static double Divide(double paraml, double param2) {

return paraml / param2;

}

***

ProcessDelegate process;

double paraml = 0.15;

double param2 =0.5;

process = new ProcessDelegate (Multiply);

// или process = new ProcessDelegate (Divide);

Console.WriteLine("Result: {0}", process(param1, param2));

***

}

Сравнение объектов. В объектно-ориентированном мире понятие "равные объекты" может иметь различный смысл. В простейшем случае речь идет о ссылочном равенстве, которое проверяется с помощью статического метода object.ReferenceEquals или встроенного в C# оператора == для объектов. Речь может идти и о сравнении "внутренней структуры". Для этой цели многие типы переопределяют виртуальный метод Equals класса System.Object. Существует также удобный статический метод object.Equals с двумя аргументами, который осуществляет проверку в несколько этапов. Сначала он проверяет свои аргументы на ссылочное равенство, возвращая true в случае успеха. Затем, если оба аргумента не равны null, сравнивает их, вызывая экземплярный метод Equals у левого аргумента и возвращая его результат. Наконец, он возвращает false, если только один из аргументов равен null. Таким образом, за выбор алгоритма сравнения в данном случае "отвечает" левый аргумент.

Клонирование объектов. Метод Object.MemberwiseClone.

Метод MemberwiseClone для создания неполной копии создает новый объект, а затем копирует в него нестатические поля текущего объекта. Если поле относится к типу значения, выполняется побитовое копирование полей. Если поле относится к ссылочному типу, копируются ссылки, а не объекты, на которые они указывают; следовательно, ссылки в исходном объекте и его клоне указывают на один и тот же объект.