Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Библиотека классов .NET Framework



Возможности среды CLR

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

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

Среда выполнения обеспечивает управление доступом для кода..Например, пользователи могут доверить исполняемому приложению, внедренному в веб-страницу, воспроизведение анимации на экране или звукозаписи, не позволяя ему при этом получить доступ к личным данным, файловой системе или сети.Таким образом, средства безопасности CLR предоставляют подлинному развернутому в Интернете программному обеспечению исключительно богатые функции.

Среда выполнения также обеспечивает надежность кода, реализуя инфраструктуру строгой типизации и проверки кода, которую называют системой общих типов (CTS).Система общих типов обеспечивает самоописание всего управляемого кода.Различные языковые компиляторы корпорации Майкрософт и независимых изготовителей создают управляемый код, удовлетворяющий системе общих типов .Это означает, что управляемый код может принимать другие управляемые типы и экземпляры, при этом обеспечивая правильность типов и строгую типизацию.

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

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

Хотя среда выполнения разрабатывалась для будущего программного обеспечения, она также поддерживает сегодняшнее и вчерашнее программное обеспечение.Взаимодействие управляемого и неуправляемого кодов позволяет разработчикам использовать необходимые компоненты COM и библиотеки DLL.

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

И наконец, среда выполнения может размещаться в высокопроизводительных серверных приложениях, таких как Microsoft® SQL Server™ и Internet Information Services (IIS).Такая инфраструктура позволяет использовать управляемый код для написания собственной логики программ, пользуясь при этом высочайшей производительностью лучших производственных серверов, которые поддерживают размещение среды выполнения.

Центральной частью каркаса .NET является его Общеязыковая исполняющая среда - Common Language Runtime (CLR), или .NET runtime.

Код, исполняемый под управлением CLR, часто называют управляемым кодом.

Однако перед тем как код сможет исполниться CLR, любой исходный текст (на C# или другом языке) должен быть скомпилирован. Компиляция в .NET состоит из двух шагов:

  1. Компиляция исходного кода в IL.
  2. Компиляция IL в специфический для платформы код с помощью CLR.

Этот двухшаговый процесс компиляции очень важен, потому что наличие IL(управляемого кода) - это ключ ко многим преимуществам .NET.

Промежуточное представление содержит всю необходимую информацию о программе, но не привязано к какому-либо определенному языку программирования или к машинному коду какой-либо целевой платформы. Для запуска программы необходимо специальное окружение, которое может исполнять программу (execution engine).

Важной особенностью трансляции в .NET является то, что промежуточное представление не интерпретируется; вместо этого используется механизм just-in-time компиляции, который генерирует машинный код.

 

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

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

очевидно, обеспечивает более высокую скорость выполнения приложения по сравнению

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

обычный настольный компьютер можно установить один — два недорогих диска объемом

60-120 Гбайт, этот фактор не играет существенной роли.

 

Достоинства: 1 – возможность обработки исключений 2 – универсальность использования разных языков и подключения библиотек. Недостатки: требования высокой производительности.

 


5. Атрибуты в .NET. Назначение. Привести примеры использования атрибутов.

Атрибуты предоставляют эффективный метод связывания декларативной информации с кодом (типы, методы, свойства и т. д.).Атрибут, связанный с сущностью программы, может быть запрошен во время выполнения с помощью метода, называемого отражением..Дополнительные сведения см. в разделе Отражение (C# и Visual Basic).

Атрибуты имеют следующие параметры.

  • Атрибуты добавляют в программу метаданные.Метаданные представляют собой сведения о типах, определенных в программе.Все сборки .NET содержат заданный набор метаданных, описывающих типы и члены типов, определенных в сборке.Для задания необходимых дополнительных сведений можно добавить атрибуты.Дополнительные сведения см. в разделе Создание настраиваемых атрибутов (C# и Visual Basic).
  • Один или несколько атрибутов могут применяться к сборкам, модулям или более мелким программным элементам, таким как классы и свойства.
  • Атрибуты могут принимать аргументы точно так же, как методы и свойства.
  • Программа может проверить собственные метаданные или метаданные в других программах с помощью отражения.Дополнительные сведения см. в разделе Обращение к атрибутам с помощью отражения (C# и Visual Basic).

Использование атрибутов

Атрибуты могут быть размещены в большинстве объявлений, хотя определенный атрибут может ограничить типы объявлений, в которых он допустим.В C# атрибут задается путем размещения его имени, заключенного в квадратные скобки ([]), перед объявлением сущности, к которой он относится.В Visual Basic атрибуты заключаются в угловые скобки (< >).Их необходимо помещать непосредственно перед элементом, к которому они относятся, на той же строке.

Объявление метода с атрибутом DllImportAttribute выглядит следующим образом.

using System.Runtime.InteropServices;

 

 

...

 

 

[System.Runtime.InteropServices.DllImport("user32.dll")]

extern static void SampleMethod();

 

Можно создать собственные настраиваемые атрибуты, задав класс атрибутов, который явно или косвенно наследует от Attribute, что облегчает и ускоряет определение атрибутов в метаданных.Предположим, что необходимо пометить типы именем программиста, который разработал его.Можно задать класс настраиваемых атрибутов Author:

[System.AttributeUsage(System.AttributeTargets.Class |

                  System.AttributeTargets.Struct)

]

public class Author : System.Attribute

{

private string name;

public double version;

 

public Author(string name)

{

   this.name = name;

   version = 1.0;

}

}

 

 

В качестве имени класса используется имя атрибута Author.Он является производным от System.Attribute, следовательно, это класс настраиваемых атрибутов.Параметры конструктора являются позиционными параметрами настраиваемых атрибутов.В этом примере name является позиционным параметром.Все открытые поля чтения и записи и свойства являются именованными параметрами.В данном случае version является единственным именованным параметром.Обратите внимание, что атрибут AttributeUsage используется для того, чтобы атрибут Author был действителен только для объявлений классов и struct (Structure в Visual Basic).

Новый атрибут можно использовать следующим образом:

[Author("P. Ackerman", version = 1.1)]

class SampleClass

{

// P. Ackerman's code goes here...

}

 


 

6. Библиотека классов Microsoft .NET Framework. Примеры использования библиотеки классов.


Директивы using и ссылки

Прежде чем можно будет использовать классы заданного пространства имен в программе на C#, в исходный файл с кодом C# потребуется добавитьдирективу using для этого пространства имен. В ряде случаев также потребуется добавить ссылку на библиотеку DLL с этим пространством имен; Visual C# автоматически добавляет ссылки для наиболее распространенные DLL библиотек классов. Добавленные ссылки можно просмотреть в Обозревателе решений под узлом Ссылки. Дополнительные сведения см. в разделе Создание проекта (Visual C#).

После добавления директивы using для пространства имен можно создать экземпляры его типов, методов вызова и реагировать на события так, как если бы они были объявлены в собственном исходном коде. В редакторе кода Visual C# можно также поместить курсор на имя типа или члена и нажать клавишу F1 для просмотра справочной документации. Кроме того, сведения о типах по классам и структурам .NET Framework можно получить при помощи средстваОбозреватель объектов и функции Метаданные как исходный код. Дополнительные сведения см. в разделе Моделирование и анализ кода (Visual C#).


 

7. Библиотеки классов ввода/вывода пространства имен System.IO. Примеры использования.

 

Пространство имен System.IO содержит типы, позволяющие осуществлять чтение и запись в файлы и потоки данных, а также типы для базовой поддержки файлов и папок. Например перечислители FileAttributes Предоставляет атрибуты для файлов и папок. Или классы StreamReader Реализует TextReader, который считывает символы из потока байтов в определенной кодировке.

 

http://msdn.microsoft.com/ru-ru/library/system.io(v=VS.100).aspx

 

  public string getinfo(string name)

   {

       try{

       string info;

       using(System.IO.StreamReader SR =new System.IO.StreamReader("d:\\file.txt"))

       {

           while ((System.IO.SR.ReadLine()) != name) { System.IO.SR.ReadLine();}

           info= System.IO.SR.ReadLine();

       }

       return info;}

       catch{return "";}

   }

 


 

8. Взаимодействие с неуправляемым кодом из приложений Microsoft .NET. Варианты применения. Привести примеры использования.

 

Платформа ссылаться на это услуга, которая позволяет управляемому коду вызывать неуправляемые функции реализованы в динамически подключаемых библиотек (DLL), например, в Win32 API. Она находит и вызывает экспортируемую функцию и маршалы своих аргументов (числа, строки, массивы, структуры и т. д.) через взаимодействие границы по мере необходимости.

 

Вызов неуправляемого кода — это служба, которая позволяет управляемому программному коду вызывать неуправляемые функции, реализованные в библиотеках динамической компоновки (DLL), например, функции библиотек Win32 API.Вызов неуправляемого кода обнаруживает и вызывает экспортируемую функцию и при необходимости выполняет маршалинг ее аргументов (целых чисел, строк, массивов, структур и так далее) через границы взаимодействия.Дополнительные сведения об этой службе см. в разделе Подробное рассмотрение вызова неуправляемого кода.

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



Оператор for

Оператор for предназначен для повторного выполнения оператора или группы опера-

операторов заданное количество раз. Вот как выглядит этот оператор в общем виде:

for ( [Инициализация]; [Условие];[Приращение])

<Оператор>

Оператор [Инициализация] выполняется один раз перед началом цикла.

Перед каждой итерацией (т.е. перед каждым выполнением тела цикла «Эпера-

тор>) проверяется [Условие]. И наконец, после каждой итерации выполняется опе-

оператор [Прирашение].

Как правило, в цикле имеется переменная, играющая роль так называемой пере-

переменной цикла. При каждой итерации переменная цикла изменяет свое значение в за-

заданных пределах.

Начальное значение переменной цикла задается в программе до оператора for или

в операторе [Инициализация]. Предельное значение переменной цикла определяется

оператором приращения, а проверка ее текущего значения — в блоке [ Условие ].

Поясним сказанное на простом примере.

int i ;

forfi = 0; i < 10; i++)

{

System.Console.Write("{0} ",i ) ;

}

Здесь переменная i используется в качестве переменной цикла. Перед началом

цикла ей присваивается нулевое значение. Перед каждой итерацией содержимое пере-

переменной i сравнивается с числом 10. Если i меньше 10, тело цикла выполняется один

раз. В тело цикла мы поместили вызов метода Write, отображающий текущее значе-

значение переменной цикла на консоли.

После выполнения тела цикла значение i увеличивается на единицу в блоке при-

приращения. Далее переменная цикла вновь сравнивается с числом 10. Когда значение i

превысит 10, цикл завершится.

Таким образом, параметр цикла анализируется перед выполнением тела цикла,

а модифицируется после его выполнения.

Вот что выведет на консоль приведенный выше фрагмент программы:

0123456789

 

Прерывание цикла

С помощью оператора break можно в любой момент прервать выполнение цикла.

Например, в следующем фрагменте программы мы прерываем работу цикла, когда

значение переменной i становится больше пяти:

for(i = 0; i < 10;

if(i > 5)

break;

System. Console. Write (" {0} "',i );

 

Возобновление цикла

В отличие от оператора break, прерывающего цикл, оператор continue позволяет

возобновить выполнение цикла с самого начала.

Вот как он используется:

for(i = 0;;

System.Console.Write("{0} ",i ) ;

if(i < 9)

continue;

else

break;

}

 

Оператор do

Оператор do используется вместе с ключевым словом while. При этом условие за-

завершения цикла проверяется после выполнения его тела:

i = 0;

do

{

System.Console.Write("{0} ",i );

i + +;

} while(i < 10) ;

 

Оператор foreach

Для обработки таких типов данных, как массивы и контейнеры, язык С# предлагает

очень удобный оператор foreach, для которого нет аналога в языках программиро-

программирования С и C++.

Так как изучение этих типов данных еще впереди, в этой главе мы дадим упрощен-

упрощенное определение массива и приведем простейший пример программы, работающей

с массивами при помощи операторов for и foreach.

Итак, мы будем считать массив набором упорядоченных объектов, каждый из ко-

которых имеет свой номер, или индекс. Первый элемент массива имеет индекс 0, вто-

второй — 1 и т. д.

Массив целых чисел со знаком объявляется следующим образом:

int[] nums;

Пара квадратных скобок указывает на то, что переменная nums является массивом.

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

количество объектов, которые могут в нем храниться. Вот как объявляется и создается

массив переменных типа int:

int[] nums;

nums = new int[10];

Созданный массив инициализируется значениями по умолчанию. Для числовых

массивов в качестве такого значения используется 0.

Чтобы записать в элемент массива с заданным номером какое-либо значение, необ-

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

Ниже мы в цикле инициализируем массив, записывая в его элементы числа от 0

до 9, причем в нулевой элемент массива записывается значение 0, в первый — значе-

значение 1 и т. д.:

for(i =0; i < 10; i++)

nums[i] = i;

Чтобы отобразить содержимое всех ячеек массива, можно использовать обычный

цикл for:

for(i = 0; i < 10;

System.Console.Write("{0} ", nums(i]);

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

Хотя на первый взгляд этот способ обработки всех элементов массива достаточно

прост, ему присущи некоторые недостатки. Например, нам нужно объявлять и ини-

инициализировать переменную цикла (применяемую в роли индекса массива), а затем

увеличивать ее значение при каждой итерации. При этом нужно следить, чтобы значе-

значение переменной цикла не превысило размер массива, иначе возникнет исключение.

Оператором f oreach пользоваться намного проще:

foreach(int current in nums)

System.Console.Write("{0} ", current);

В скобках после ключевого слова f oreach мы объявляем переменную current

типа int, которой при каждой итерации будут последовательно присваиваться все

значения массива nums. Имя этого массива указывается после ключевого слова in.

Таким образом, нам не нужна переменная цикла и, следовательно, не нужно ее

инициализировать, инкрементировать и проверять, не вышло ли значение индекса

массива за допустимые пределы.

Оператор foreach сделает все за нас. Он последовательно присвоит значение

всех элементов массива переменной current, а нам останется только выводить при

каждой итерации значение этой переменной на консоль.

 


 

10. Виды циклов в языке С#. Синтаксис, объявление, применение циклов в языке С#.

делегат — это тип, который определяет подпись метода и его можно связать с любым методом с совместимой подписью. Метод можно запустить (или вызвать) с помощью делегата. Делегаты используются для передачи методов в качестве аргументов к другим методам. Обработчики событий — это ничто иное, как методы, вызываемые с помощью делегатов. Создание пользовательского метода и класса, например элемента управления Windows, может вызывать метод при возникновении определенного события.

 

public delegate int PerformCalculation(int x, int y);

Делегаты имеют следующие свойства.

· Делегаты похожи на указатели функций в C++, но являются строго типизированными.

· Делегаты допускают передачу методов в качестве параметров.

· Делегаты можно использовать для задания функций обратного вызова.

· Делегаты можно связывать друг с другом; например, несколько методов можно вызвать по одному событию.

· Точное соответствие методов подписи делегата не требуется. Дополнительные сведения см. в разделе Covariance and ContravarianceКовариация и контрвариация в делегатах (руководство по программированию в C#).

· В C# версии 2.0 представлена концепция анонимных методов, которые позволяют передавать блоки кода в виде параметров вместо использования отдельно определенного метода. В C# 3.0 для краткой записи встроенных блоков кода введены лямбда-выражения. В результате компиляции как анонимных методов, так и лямбда-выражений (в определенном контексте) получаются типы делегатов. В настоящее время эти функции объединяются под одним названием — анонимные функции. Дополнительные сведения о лямбда-выражениях см. в разделе Анонимные функции (Руководство по программированию в C#).

· public delegate void Del(string message); // Create a method for a delegate.public static void DelegateMethod(string message){ System.Console.WriteLine(message);} // Instantiate the delegate.Del handler = DelegateMethod; // Call the delegate.handler("Hello World");

 

 

Типы делегатов являются производными от класса Delegate в платформе .NET Framework. Типы делегатов являются запечатанными — от них нельзя наследовать, а от Delegate нельзя создавать производные пользовательские классы. Поскольку созданный экземпляр делегата является объектом, его можно передавать как параметр или назначать свойству. Это позволяет методу принимать делегат в качестве параметра и вызывать делегат впоследствии. Эта процедура называется асинхронным обратным вызовом и обычно используется для уведомления вызывающего объекта о завершении длительной операции. Когда делегат используется таким образом, коду, использующему делегат, не требуются сведения о реализации используемого метода. Данные функциональные возможности похожи на возможности, предоставляемые интерфейсами инкапсуляции. Дополнительные сведения см. в разделе

 

 


 

11. Делегаты и события на платформе Microsoft .NET.

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

При обмене событиями классу отправителя событий не известен объект или метод, который будет получать (обрабатывать) сформированные отправителем события. Необходимо, чтобы между источником и получателем события имелся посредник (или механизм подобный указателю). .NET Framework определяет специальный тип (Delegate), обеспечивающий функциональные возможности указателя функции.

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

Пользовательские делегаты событий необходимы только в случаях, когда событие создает данные для события. Многие события, включая некоторые события пользовательского интерфейса, например щелчки мышью, не создают данных для события. В таких ситуациях делегат события, предоставляемый библио��екой классов для события без данных, System.EventHandler является целесообразным. Его объявление приводится ниже.

delegate void EventHandler(object sender, EventArgs e);

 

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

---------------------------

Функциональные возможности события обеспечивают три взаимосвязанные элемента: класс, предоставляющий данные события, делегат события и класс, вызывающий событие. В среде .NET Framework используется соглашение по присвоению имен классам и методам, относящимся к событиям. Чтобы класс мог вызывать событие с именем EventName, необходимы следующие элементы:

· Класс, содержащий данные события, именуемый как EventNameEventArgs. Этот класс должен наследоваться от System.EventArgs.

· Делегат для события, именуемый как EventNameEventHandler.

· Класс, вызывающий событие. Этот класс должен предоставить объявление события (EventName) и метод, инициирующий событие (OnEventName).

Класс данных события и класс делегата события могут быть уже определены в библиотеке классов .NET Framework или в библиотеке классов независимых разработчиков. В данном случае не требуется определять эти классы. Например, если событие не использует пользовательские данные, то можно использовать System.EventArgs для данных события и System.EventHandler для делегата.

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

private EventNameHandler eh = null;

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

После определения реализации события, необходимо определить, когда следует инициировать событие. Событие инициируется вызовом защищенного метода OnEventName в классе, определяющем событие, или в производном классе. Метод OnEventName вызывает событие посредством вызова делегатов, передавая все характерные для события данные. Методы делегата события могут выполнять действия для события или обрабатывать характерные для события данные.

При необходимости обработки событий, вызванных в другом классе, добавьте методы делегата к событию. Если вы не знакомы с моделью делегатов событий в .NET Framework, см. раздел События и делегаты.

using System;delegate void MyEventHandler();class MyEvent{ public event MyEventHandler SomeEvent;       public void OnSomeEvent() {   if (SomeEvent != null)       SomeEvent(); }}class CTest{     static void handler(){   Console.WriteLine("Some event!"); } static void Main(){         MyEvent evt = new MyEvent();   evt.SomeEvent += new MyEventHandler(handler);   evt.OnSomeEvent();           Console.ReadLine(); }

 

 


 

12. Классы и объекты на платформе .NET. Объявления. Хранение объектов в стеке и куче (heap).

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

Далее представлен пример определения класса с именем SampleClass и создание объекта с именем sampleClass1, который является экземпляром этого класса. Поскольку необходимо, чтобы функция Main была определена внутри класса, в следующем коде также определяется класс Program, однако он не используется для создания объекта.

Члены экземпляра и статические члены

Классы и файлы

Инкапсуляция

Наследование

Полиморфизм

 

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

 

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

Экземпляры классов создаются с помощью оператора new. В следующем примере Person является типом, а person1 и person 2 — являются экземплярами или объектами этого типа.

 

 

Person p1 = new Person("Wallace", 75); в кучеPerson p2; в стекеp2.Name = "Wallace";p2.Age = 75; if (p2.Equals(p1)) Console.WriteLine("p2 and p1 have the same values."); // Output: p2 and p1 have the same values.

 


 

13. Компонентное программирование, показать применение этого подхода на практике. Сборки и их устройство.

 


Компонентно-ориентированное программирование
(англ. component-oriented programming) возникло как своего рода дисциплина, то есть набор определенных ограничений, налагаемых на механизм ООП, когда стало ясно, что бесконтрольное использование ООП приводит к проблемам с надежностью больших программных комплексов.

Это так называемая проблема хрупких базовых типов (fragile base class problem); проблема может проявиться при попытке изменить реализацию типа-предка, когда может оказаться, что изменить реализацию типа-предка даже при неизменных интерфейсах его методов невозможно, не нарушив корректность функционирования типов-потомков.

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

 

Компонентное программирование в .NET

Пожалуй, наиболее существенным нововведением идеологии Microsoft .NET является компонентно-ориентированный подход к программированию.
Во-первых, следует отметить то обстоятельство, что компонентно-ориентированный подход к проектированию и реализации программных систем и комплексов является в некотором смысле развитием объектно-ориентированного и практически более пригоден для разработки крупных и распределенных систем (например, корпоративных приложений).
Прежде всего, сформулируем основополагающее для рассматриваемого подхода определение компонента. Под компонентом будем далее иметь в виду независимый модульпрограммного кода, предназначенный для повторного использования и развертывания. Как видно из определения, применение компонентного программирования призвано обеспечить более простую, быструю и прямолинейную процедуру первоначальной инсталляции прикладного программного обеспечения, а также увеличить процент повторного использования кода, т.е. усилить основные преимущества ООП.
Говоря о свойствах компонентов, следует прежде всего отметить, что это существенно более крупные единицы, чем объекты (в том смысле, что объект представляет собой конструкцию уровня языка программирования). Другими отличиями компонентов от традиционных объектов являются возможность содержать множественные классы и (в большинстве случаев) независимость от языка программирования.
Заметим, что, автор и пользователь компонента, вообще говоря, территориально распределены и используют разные языки. Вполне возможно, что они не только пишут программы, но и говорят на разных языках.
Получив представление о компонентах и их отличиях от традиционных объектов ООП, рассмотрим существующие подходы к моделированию вариаций компонентного подхода в современной практике проектирования и реализации программных комплексов и систем.
Прежде всего, поскольку основной вычислительной средой для исследования в данном курсе является Microsoft .NET, обсудим особенности модели для компонентно-ориентированной разработки программного обеспечения, предложенной корпорацией Microsoft. Эта модель называется компонентной объектной моделью (или Component Object Model, COM) и является изначальным стандартом, принятым для компонентной разработки приложений в корпорации Microsoft.
Компонентная модель COM определяет протокол для конкретизации (т.е. создания экземпляров) и использования компонент (по аналогии с классами и объектами) как внутри одного и того же процесса, так и между различными процессами или компьютерами, предназначенными для выполнения того или иного программного проекта, основанного на компонентной технологии. Модель COM является достаточно универсальной и используется в качестве фундамента для таких технологий проектирования и реализации программного обеспечения, как ActiveX, OLE и целого ряда других технологий. Приложения для COM-модели могут создаваться средствами таких языков и сред разработки как Visual Basic, C++, .NET и т.д.

Пример -

ASP.NET - технология для создания исполняемых на сервере сценариев. Технология позволяет обращаться к компонентам на сервере как к локальным компонентам среды выполнения. Страницы ASP.NET можно легко создавать при помощи визуального редактора, входящего в состав Visual Studio 2003. Сами страницы при этом являются объектами классов

В рамках компонентного подхода сборкой называется логическая единица, содержащая множество модулей, необходимых для осуществления инсталляции программного обеспечения. Сборка характеризуется уникальностью, которая обеспечивается идентификатором версии сборки и цифровой подписью автора. Сборка является самодостаточной единицей для установки программного обеспечения и не требует никаких дополнений. Возможно как индивидуальное, так и коллективное (сетевое) использование сборки на основе компонентной технологии. Сборка обеспечивает простой и удобный механизм инсталляции и экономит средства, необходимые дляразвертывания программного обеспечения, сводя к минимуму затраты времени и сил на установку.
Описание сборки содержится в так называемом манифесте, где хранятся метаданные о компонентах сборки, идентификация автора и версии, сведения о типах и зависимостях, а также режим и политика использования. Метаданные типов манифеста исчерпывающе описывают все типы, определенные в сборке, а именно, свойства, методы, аргументы, возвращаемые значения, атрибуты, базовые классы и т.д.
Заметим, что промежуточный язык IL всегда компилируется в естественный (native) код до выполнения программы.
Для более эффективного манипулирования системой типизации компонент создаваемого программного обеспечения в рамках модели COM, концепция .NET предусматривает механизм пространств имен (namespace).
Пространством имен будем называть механизм среды Microsoft .NET, предназначенный для идентификации типов объектов языков программирования и среды реализации.
Описания пространств имен по аналогии с описаниями типов данных размещаются в файлах. Перечислим основные свойства, которыми характеризуются пространства имен в среде Microsoft .NET. Прежде всего, пространства имен могут как объединять различные сборки, так и быть вложенными друг в друга. Кроме того, файлы с описаниями могут содержать множественные пространства имен. Важно отметить, что между пространствами имен и файлами не существует однозначного соответствия..

Рассмотрим особенности использования механизма сборок, важнейшей концепции компонентного программирования, применительно к языку C#. Сборка является минимальной единицей для развертывания приложений, т.е. представляет собой своеобразный атом компонентного программирования. Каждый тип сборки характеризуется уникальным идентификатором – номером версии сборки. Таким образом, каждый программный проект формируется в виде сборки, которая является самодостаточным компонентом для развертывания, тиражирования и повторного использования. Сборка идентифицируется цифровой подписью автора и уникальным номером версии. Между сборками и пространствами имен существует следующее соотношение. Сборка может содержать несколько пространств имен. В то же время, пространство имен может занимать несколько сборок. Сборка может иметь в своем составе как один, так и несколько файлов, которые объединяются в так называемом манифесте или описании сборки, который подобен оглавлению книги. Манифест содержит метаданные о компонентах сборки, идентификацию автора и версии, сведения о типах и зависимостях, а также описывает режим и политику использования сборки. Метаданные типов манифеста в полной мере описывают все типы, которые содержатся в сборке. В ходе обсуждения реализации механизма сборок в языке программирования C# следует отметить еще несколько важных характеристик. Прежде всего, сборка как элемент языка программирования C# является аналогом компонента в среде проектирования и реализации программного обеспечения Microsoft .NET. В результате компиляции программного кода на языке C# в среде вычислений .NET (например, в .NET Framework SDK) создается либо сборка, либо так называемый модуль. При этом сборка существует в форме исполняемого файла (с расширением EXE), а также файла динамически присоединяемой библиотеки (с расширением DLL). Естественно, в состав сборки входит манифест. Модуль представляет собой файл с расширением .NETMODULE и, в отличие от сборки, не содержит в своем составе манифеста. Заметим, что интеграция в программный проект других модулей и ресурсов (в частности, типов и метаданных) может быть осуществлена посредством системного программного обеспечения, известного под названием компоновщика сборок. Подводя итоги рассмотрения основных аспектов концепции компонентно-ориентированного подхода к программированию и особенностей реализации этой концепции применительно к языку программирования C#, кратко отметим достоинства подхода. Прежде всего, важным практическим следствием реализации концепции компонентного подхода для экономики программирования является снижение стоимости проектирования и реализации программного обеспечения. Еще одно очевидное достоинство компонентного программирования – возможность усовершенствования стратегии повторного использования кода. Код с более высокимуровнем абстракции не требует существенной модификации при адаптации к изменившимся условиям задачи или новым типам данных. Кроме того, к преимуществам концепции компонентного программирования следует отнести унификацию обработки объектов различной природы. В самом деле, абстрактные классы и методы позволяют единообразно оперировать гетерогенными данными, причем для адаптации к новым классам и типам данных не требуется реализации дополнительного программного кода. Важно также отметить, что идеология компонентного программирования основана на строгом математическом фундаменте (в частности, в виде формальной системы ламбда-исчисления), что обеспечивает интуитивную прозрачность исходного текста для математически мыслящего программиста, а также верифицируемость программного кода. Наконец, концепция компонентного программирования, по сути, универсальна и в равной степени применима для различных подходов к программированию, включая функциональный и объектно-ориентированный. Завершая вторую часть учебного курса, посвященного исследованию современных языков программирования (на примере языка программирования C#) и поддерживающих их сред вычислений (на примере инструментально-технологической платформы .NET), кратко резюмируем содержание рассмотренных вопросов и проблем. Прежде всего, нами был рассмотрен объектно-ориентированный подход к проектированию и реализации программного обеспечения в сопоставлении с другими подходами. Затем было дано представление о важнейших концепциях, которые составляют теоретическое и практическое основание объектно-ориентированного подхода к программированию. В частности, были рассмотрены концепции объекта, класса, метода, абстракции, инкапсуляции, наследования, полиморфизма, а также подходы к их формализации на основе исчисления ламбда-конверсий, комбинаторной логики, теории решеток и концептуализации. Далее, посредством перечисленных теорий были формализованы такие важнейшие аспекты объектно-ориентированных языков программирования, как синтаксис и семантика. Кроме того, было исследовано понятие типа, изучены основы теории типов и типизации в языках программирования, реализованных в среде вычислений .NET. Затем мы перешли к рассмотрению вопросов, связанных с событийно-ориентированным программированием. Наконец, было исследована трансформация ООП в приложении к среде .NET, которая привела к появлению компонентного подхода, основанного на объектной моделиCOM. Вполне естественно, что, исходя из обширного спектра и глубины рассматриваемой проблематики, ряд важнейших аспектов реализации современных языков программирования (в рамках изложенного курса) был лишь обозначен или изложен весьма конспективно. В связи с этим, представляет интерес систематическое изучение следующих вопросов:
  1. компонентная разработка интегрированных гетерогенных программных систем на профессиональном уровне (на примере языков программирования SML и C#);
  2. разработка событийно-управляемых приложений;
  3. математически строгий сравнительный анализ функционального и объектно-ориентированного подходов к программированию на основе изученных теоретических разделов computer science;
  4. формализация семантики событийно управляемого (и, возможно, компонентно-ориентированного) программирования.
Согласно общей концепции изложения курса, дальнейшие исследования имеет смысл вести синтетически по направлениям теоретического обоснования программирования на основе изученных формальных систем computer science и современной практики проектирования и реализации программного обеспечения на основе универсальной и прогрессивной программно-инструментальной платформы Microsoft .NET.

 

Сборка

{ заголовки и заглушки {}

  метаданные{}

модули

{

пространства имен

{

классы{переменные и методы}

классы{…}

}

пространства имен

{…

}

}

}

 


 

13(2). Компонентное программирование в .NET (1)

 



















If, else и else if

Эти операторы одинаковы в обоих языках.

Оператор switch

В обоих языках оператор switch обеспечивает несколько условных операций ветвления. При этом разница заключается в том, что Java позволяет "проваливаться" в case и выполнять следующий case, если в конце варианта не используется оператор break. Однако в C# в конце каждого case необходимо использовать оператор break или оператор goto, и если не использовать ни одного оператора, то компилятор выдаст следующую ошибку:

Управление не может "проваливаться" из одной метки case в другую.

Обратите внимание, что там, где case не указывает какого-либо кода для выполнения при совпадении с этим case, управление проваливается к последующему case. При использовании goto в операторе switch можно только переходить в другой блок case в том же переключателе. Для перехода к case по умолчанию следует использовать goto default.. В противном случае, потребуется использовать goto case cond, где cond – совпадающее условие case, к которому требуется перейти. Другое отличие от switch в Java заключается в том, что в Java switch можно применять только для целочисленных типов, в то время как язык C# позволяет использовать switch для переменной строки.

Возврат goto

goto в Java – это зарезервированное ключевое слово, которое не реализовано. При этом можно использовать операторы с метками с break или continueдля достижения той же цели, что и с использованием goto.

Язык C# не позволяет оператору goto переходить к оператору с меткой. При этом следует отметить, что для перехода к соответствующей метке операторgoto должен быть в области этой метки. Другими словами, goto нельзя использовать для перехода в блок оператора, хотя можно использовать для выхода из него, выхода из класса или выхода из блока finally в операторах try...catch. Использование ключевого слова goto не рекомендуется в большинстве случаев, так расходится с принятой практикой объектно-ориентированного программирования.


19. Основные операторы языка C#


 

Основные x.y f(x) a[x] x++ x-- new typeof checked unchecked ->

Унарные + - ! ~ ++x --x (T)x true false & sizeof

Мультипликативные * / % Аддитивные + -

Сдвиг << >> Относительные и тестирующие тип < > <= >= is as

Операторы равенства == !=

Логическое AND & Логическое XOR ^ Логическое OR |

Условное AND &&

Условный оператор OR ||

Условное ?:

Присваивание = += -= *= /= %= &= |= ^= <<= >>= Поддержка значения NULL ?? Лямбда-оператор Оператор =>

public struct Complex{ public int real; public int imaginary; public Complex(int real, int imaginary) //constructor {   this.real = real;   this.imaginary = imaginary; } // Declare which operator to overload (+), // the types that can be added (two Complex objects), // and the return type (Complex): public static Complex operator +(Complex c1, Complex c2) {   return new Complex(c1.real + c2.real, c1.imaginary + c2.imaginary); }

}

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

 


 

20. Основные типы данных в языке С#. Приведение типов в языке С#.

byte 0 .. 255

sbyte -128 .. 127

short -32,768 .. 32,767

ushort 0 .. 65,535

int -2,147,483,648 .. 2,147,483,647

uint 0 .. 4,294,967,295

long -9,223,372,036,854,775,808 .. 9,223,372,036,854,775,807

ulong 0 .. 18,446,744,073,709,551,615

float -3,402823e38 .. -3,402823e38 ..

double -1,79769313486232e308 .. 1,79769313486232e308

 

decimal -79228162514264337593543950335 .. 79228162514264337593543950335

char Символ Юникода.

string Строка символов Юникода.

bool true или false

object Объект.

 

Приведение типов данных Int i=1;Double d=23;i = (int) d;

 


 

21. Преимущества технологии Windows Forms над Win32 API и MFC. Примеры.

Windows Forms это имя, данное в графический интерфейс прикладного программирования (API) включены как частьMicrosoft в . NET Framework , обеспечивая доступ к родной Microsoft Windows элементов интерфейса, заключив существующих API Windows в управляемом коде . Хотя видно, в качестве замены для более ранних и более сложные C + + основана Microsoft Foundation Class библиотека , она не дает парадигмы сопоставимы с модель-представление-контроллер . Некоторые после рынка и библиотеки сторонних производителей были созданы, чтобы обеспечить эту функциональность. Наиболее широко используемый из них Пользовательский интерфейс процесса Application Block , который выделяется на модели Microsoft и практики группы для бесплатного скачивания, что включает в себя исходный код для быстрого начала примеры.

Конструктор Windows Forms обеспечивает визуальную среду разработки для размещения Windows Presentation Foundation контроля. Управления WPF размещается в специальных форм управления Windows, который называется ElementHost . Этот элемент управления позволяет контролировать WPF для участия в макет формы и получить клавиатуры и мыши сообщений. Во время разработки, вы можете организовать ElementHost управления так же, как и любой формы управления Windows.

 

public Form1()

   {

       InitializeComponent();

   }

 

   private void button1_Click(object sender, EventArgs e)

   {

       label1.Text = label1.Text + "0";

       label1.Text.Collor = red;

   }

int APIENTRY WinMain(HINSTANCE hCurrentInst,HINSTANCE hPreviousInst, LPSTR lpszCmdLine,int nCmdShow){    // Задать класс окнаWNDCLASS wndClass;wndClass.style = CS_HREDRAW | CS_VREDRAW;  // Стиль окнаwndClass.lpfnWndProc = WndProc;           

LRESULT APIENTRY WndProc(HWND hWnd, UINT message,WPARAM wParam, LPARAM lParam){// обработать все сообщения, на которые приложение должно реагироватьswitch(message){case …:

Когда ОС Microsoft Windows только появилась на свет, мы, как и множество других про-

программистов, создавали для нее приложения на языках С и C++. При этом нам приходилось

напрямую обращаться к программному интерфейсу (API) этой ОС, обрабатывая сообще-

сообщения при помощи оператора swi tch.

Пока приложения состояли из нескольких окон и диалоговых панелей, такая техно-

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

задача создания действительно сложных приложений Windows, имеющих очень боль-

большое количество окон и диалоговых панелей, а также нетривиальный пользовательский

интерфейс, пришлось примейить библиотеку классов MFC.

Несмотря на то что MFC сильно упрощает создание приложений Microsoft Win-

Windows, даже в комплекте с этой библиотекой инструментарий Microsoft Visual C++ едва

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

Во-первых, все еще приходится писать слишком много программного кода,

не имеющего непосредственного отношения к прикладной задаче, для решения кото-

которой создастся приложение.

Во-вторых, визуальные средства проектирования пользовательского интерфей-

интерфейса не позволяют выйти дизайну этого интерфейса за рамки стандартных «серых»

Введение 21

диалоговых панелей и надоевших уже элементов управления — кнопок, меню, спи-

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

красочно оформленные страницы Web-сайтов, едва ли стоит предлагать ему программы

с блеклым интерфейсом, разработанным еще на заре создания Microsoft Windows.

22, 30. Программирование на платформе. Структура программы на языке C#.

Полностью объектно ориентированный язык. Точка входа – статический метод main.namespace ConsoleApplication1{               class Class1               {                                                                      public static void Main(string[] args)                                    {                                                        System.Console.WriteLine("Hello World");                                     }               }}

 

 


 

23. Пространства имен. Их назначение, архитектура и применение. Примеры использования пространств имен.

 

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

Например, пространство имен System содержит класс Console, который включает методы для чтения и записи в окне консоли. В пространство имен Systemвходит ряд других пространств, например System.IO и System.Collections. Только в платформе .NET Framework представлено более 80 пространств имен, в каждом из которых находятся тысячи классов, поскольку пространства имен используются для того, чтобы избежать путаницы с типами и методами, имеющими одинаковые имена.

При написании класса вне объявления пространства имен компилятор предоставит ему заданное по умолчанию пространство имен.

Обычно пространства имен используются при работе с большими программами. Собственные пространства имен предоставляют определенный уровень контроля над методами и типами с одинаковыми именами.

namespace StatisticalData{ class FileHandling {   public void Load() {} // code to load statistical data }} namespace Images { class FileHandling {   public void Load() {} // code to load an image file }} class Program{ static void Main() {   StatisticalData.FileHandling data = new StatisticalData.FileHandling();   data.Load();    Images.FileHandling image = new Images.FileHandling();   image.Load(); }}

 


 

24. Процессы(processes), потоки(threads), в ОС Windows и их использование на платформе Microsoft .NET. Определения, функции. Пул потоков.

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

Процесс – единица владения ресурсами. Включает в себя стек, кучу, все содержание программы и потоки выполнения программы.

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

Компьютеры с несколькими процессорами или с многоядерными процессорами и Hyper-Threading-процессы могут выполнять несколько потоков в одно и то же время.Параллельная обработка нескольких потоков может значительно повысить производительность программы, но также может сделать отладку намного сложнее, так как появляется необходимость следить за несколькими потоками.

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

myThread = new System.Threading.Thread(new    System.Threading.ThreadStart(myStartingMethod));myThread.Start();

 

Пул потоков — это коллекция потоков, которые могут использоваться для выполнения нескольких задач в фоновом режиме.(Дополнительные сведения см. в разделе Работа с потоками (C# и Visual Basic).) Это позволяет разгрузить главный поток для асинхронного выполнения других задач.

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

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

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

Можно реализовать собственный пул потоков, но гораздо проще использовать пул, предоставляемый .NET Framework через класс ThreadPool.

Используя группировку потоков в пул, можно вызвать метод ThreadPool.QueueUserWorkItem с делегатом для процедуры, которую требуется выполнить, а Visual Basic или C# создаст поток и выполнит процедуру.

public void DoWork(){ // Queue a task. System.Threading.ThreadPool.QueueUserWorkItem(   new System.Threading.WaitCallback(SomeLongTask)); // Queue another task. System.Threading.ThreadPool.QueueUserWorkItem(   new System.Threading.WaitCallback(AnotherLongTask));}

 


 

25. Работа с файлами в языке С#. Синтаксис, алгоритм работы при чтении/записи в файл.

 

Используется пространство имен  ввода – выдова System.IO

FileStream, StreamWriter, StreamReader;

Способы открытия файлового потока.

Append,

 Create

CreateNew

Open

OpenOrCreate

Truncate

 

 

StreamReader sr= new SreamReader(“d:\\123.txt”);

//читаем;

Close(sr);

аналогично

using (FileStream fs = File.OpenRead(path))   {       byte[] b = new byte[1024];       UTF8Encoding temp = new UTF8Encoding(true);       while (fs.Read(b,0,b.Length) > 0)       {           Console.WriteLine(temp.GetString(b));       }   }

 

26. Работа с файлами и директориями на платформе Microsoft .NET. Примеры использования.????

С помощью OpenDialogFile и SaveDialogFIle; OpenFileDialog openDialog = new OpenFileDialog(); openDialog.Filter = "Image files (*.bmp, *.jpg, *.gif)|*.bmp;*.jpg;*.gif|All files (*.*)|*.*";// типы отсортированных файлов openDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyPictures);// начальная директорияopenDialog.FileName – имя выбранного файла

 

27. Роль общеязыковой исполняющей среды (CLR) в архитектуре .NET. Задачи, решаемые общеязыковой исполняющей средой

Общеязыковая исполняющая среда CLR (Common Language Runtime)










Возможности среды CLR

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

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

Среда выполнения обеспечивает управление доступом для кода..Например, пользователи могут доверить исполняемому приложению, внедренному в веб-страницу, воспроизведение анимации на экране или звукозаписи, не позволяя ему при этом получить доступ к личным данным, файловой системе или сети.Таким образом, средства безопасности CLR предоставляют подлинному развернутому в Интернете программному обеспечению исключительно богатые функции.

Среда выполнения также обеспечивает надежность кода, реализуя инфраструктуру строгой типизации и проверки кода, которую называют системой общих типов (CTS).Система общих типов обеспечивает самоописание всего управляемого кода.Различные языковые компиляторы корпорации Майкрософт и независимых изготовителей создают управляемый код, удовлетворяющий системе общих типов .Это означает, что управляемый код может принимать другие управляемые типы и экземпляры, при этом обеспечивая правильность типов и строгую типизацию.

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

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

Хотя среда выполнения разрабатывалась для будущего программного обеспечения, она также поддерживает сегодняшнее и вчерашнее программное обеспечение.Взаимодействие управляемого и неуправляемого кодов позволяет разработчикам использовать необходимые компоненты COM и библиотеки DLL.

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

И наконец, среда выполнения может размещаться в высокопроизводительных серверных приложениях, таких как Microsoft® SQL Server™ и Internet Information Services (IIS).Такая инфраструктура позволяет использовать управляемый код для написания собственной логики программ, пользуясь при этом высочайшей производительностью лучших производственных серверов, которые поддерживают размещение среды выполнения.


 

28. Синхронизация потоков (interlocked-функции и критические секции). Основные проблемы синхронизации.

Выражения lock (C#) и SyncLock (Visual Basic) используются для того, чтобы выполнение блока кода не прерывалось кодом, выполняемым в других потоках.Для этого нужно получить взаимоисключающую блокировку для данного объекта на время длительности блока кода.

Оператор lock или SyncLock получает объект в качестве аргумента, и за ним следует блок кода, который должен выполняться одновременно только в одном потоке.Примеры.

public class TestThreading{ private System.Object lockThis = new System.Object(); public void Process() {    lock (lockThis)     {       // Access thread-sensitive resources.   } } }

Аргумент, предоставляемый ключевому слову lock, должен быть объектом на основе ссылочного типа; он используется для определения области блокировки.В приведенном выше примере область блокировки ограничена этой функцией, поскольку не существует ссылок на объект lockThis вне функции.Если бы такая ссылка существовала, область блокировки включала бы этот объект.Строго говоря, предоставляемый объект используется только для того, чтобы уникальным образом определить ресурс, к которому предоставляется доступ для различных потоков, поэтому это может быть произвольный экземпляр класса.В действительности этот объект обычно представляет ресурс, для которого требуется синхронизация потоков.Например, если объект контейнера должен использоваться в нескольких потоках, то контейнер можно передать блокировке, а блок синхронизированного кода после блокировки должен получить доступ к контейнеру.Если другие потоки блокируются для того же контейнера перед доступом к нему, обеспечивается безопасная синхронизация доступа к объекту.

Как правило, рекомендуется избегать блокировки типа public или экземпляров объектов, которыми не управляет код вашего приложения.Например, использование lock(this) может привести к неполадкам, если к экземпляру разрешен открытый доступ, поскольку внешний код также может блокировать объект.Это может привести к созданию ситуаций взаимной блокировки, когда два или несколько потоков будут ожидать высвобождения одного и того же объекта.По этой же причине блокировка открытого типа данных (в отличие от объектов) может привести к неполадкам.Блокировка строковых литералов наиболее опасна, поскольку строковые литералы интернируются средой CLR.Это означает, что если во всей программе есть один экземпляр любого строкового литерала, точно такой же объект будет представлять литерал во всех запущенных доменах приложения и во всех потоках.В результате блокировка, включенная для строки с одинаковым содержимым во всем приложении, блокирует все экземпляры этой строки в приложении.По этой причине лучше использовать блокировку закрытых или защищенных членов, для которых интернирование не применяется.В некоторых классах есть члены, специально предназначенные для блокировки.Например, в типе Array есть SyncRoot.Во многих типах коллекций есть член SyncRoot.

Как и ключевые слова lock и SyncLock, мониторы не допускают одновременное выполнение несколькими потоками одних и тех не блоков кода.Метод Enterпозволяет только одному методу переходить к последующим операторам, все прочие методы заблокированы, пока выполняемый метод не вызоветExit.Это аналогично использованию ключевого слова lock.

System.Object obj = (System.Object)x;System.Threading.Monitor.Enter(obj);try{ DoSomething();}finally{ System.Threading.Monitor.Exit(obj);}

Мьютекс аналогичен монитору, он не допускает одновременного выполнения блока кода более чем из одного потока.Название "мьютекс" – сокращенная форма слова "взаимоисключающий" ("mutually exclusive" на английском языке). Впрочем, в отличие от мониторов мьютексы можно использовать для синхронизации потоков по процессам.Мьютекс представляется классом Mutex.

 

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

Предоставляет атомарные операции для переменных, общедоступных нескольким потокам.

Тип Interlocked предоставляет следующие члены.

Add(Int32, Int32)          Добавляет два 32-битных целых числа и заменяет первое число на сумму (атомарная операция). CompareExchange(Double, Double, Double)        Сравнивает два числа с плавающей запятой с двойной точностью на ет два числа с плавающей запятой с обычной точностью на равенство и, если они равны, заменяет одно из значений. CompareExchange<T>(T, T, T) Сравнивает два экземпляра указанного ссылочного типа T на равенство и, если это так, заменяет один из них.

Decrement(Int32)          Уменьшает значение заданной переменной и сохраняет результат — как атомарная операция. Exchange<T>(T, T)       Задает переменную указанного типа T в значение и возвращает исходное значение (атомарная операция).

Increment(Int) Увеличивает значение заданной переменной и сохраняет результат — как атомарная операция.

Read     

                       

 

static bool UseResource()   {       //0 indicates that the method is not in use.       if(0 == Interlocked.Exchange(ref usingResource, 1))       {           Console.WriteLine("{0} acquired the lock", Thread.CurrentThread.Name);            //Code to access a resource that is not thread safe would go here.            //Simulate some work           Thread.Sleep(500);            Console.WriteLine("{0} exiting lock", Thread.CurrentThread.Name);            //Release the lock           Interlocked.Exchange(ref usingResource, 0);           return true;            }

 


 

29. Способы передачи параметров вызова. Передача по значению и по ссылке, их различия и варианты применения.

 

В C# параметры могут быть переданы либо по значению, либо по ссылке. Передача параметров по ссылке позволяет изменять и сохранять измененные значения параметров членов функций, методов, свойств, индексаторов, операторов и конструкторов. Для передачи параметра по ссылке используйте ключевое слово ref или out. Для простоты в этом примере используется только ключевое слово ref. Дополнительные сведения об отличиях ключевых словref и out (out может быть непроинициализирован при передаче по ссылке)

 

static void Square(int x){ // code...}static void Square(ref int x){ // code...}

 

 


 

30. Строгая и нестрогая типизация, характеристики типов данных. Определение типа данных.

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

Специальный (или лат. adhoc) полиморфизм допускает специальную реализацию для данных каждого типа. Например, используемая в нашем примере функцией сортировки функция сравнения должна быть определена по-разному для чисел, кортежей, списков, т. е. она является специально полиморфной.

 При сильной(строгой) типизации все типы известны заранее, и преобразование проходит по заранее установленным строгим правилам. Строгим, понятно, по отношению к правилам принятым при слабой типизации.

Сильную (строгую) типизацию, представляет язык C#. Если раньше в C++ мы могли написать:

MyObj* m_pObj = GenerateMyObj();

if(!m_pObj)

return -1;

То уже в C# такое преобразование типов не пройдёт, тут будь добр делать все явно:

MyObjm_pObj = GenerateMyObj();

if(m_pObj == null)

return -1;

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

У строгой типизации есть одно неоспоримое преимущество, такой код надёжнее. Однако и вслабой есть свои плюсы, язык с такой системой типов более гибкий. В компилируемых языках (С, С++) строгая типизация оказывается удобнее.

Тип данных - характеристика набора данных, которая определяет:

- диапазон возможных значений данных из набора;

- допустимые операции, которые можно выполнять над этими значениями;

- способ хранения этих значений в памяти.

Различают:

- простые типы данных: целые, действительные числа и др.;

- составные типы данных: массивы, файлы и др.


 

31. Структуры данных на платформе Microsoft .NET (массивы, списки, коллекции, хеш-таблицы), их свойства, примеры использования.

 

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

type[] arrayName;

Массив имеет следующие свойства.

· Массив может быть одномерным, многомерным или массивом массивов.

· Значение по умолчанию числовых элементов массива задано равным нулю, а элементы ссылок имеют значение NULL.

· Невыровненный массив является массивом массивов и поэтому его элементы являются ссылочными типами и инициализируются значением null.

· Индексация массивов начинается с нуля: массив с элементами n индексируется от 0 до n-1.

· Элементы массива могут быть любых типов, включая тип массива.

· Типы массива являются ссылочными типами, производными от абстрактного базового типа Array. Поскольку этот тип реализует IEnumerable иIEnumerable<T>, в C# во всех массивах можно использовать итерацию foreach.

 

int[][] jaggedArray3 = { new int[] {1,3,5,7,9}, new int[] {0,2,4,6}, new int[] {11,22}};

 

Библиотека классов .NET Framework предоставляет ряд универсальных классов коллекций в пространствах имен System.Collections.Generic иSystem.Collections.ObjectModel.Дополнительные сведения об этих классах содержатся в разделе Часто используемые типы коллекций.





System.Collections.Generic

Большинство типов универсальных коллекций являются прямыми аналогами неуниверсальных типов.Dictionary<TKey, TValue> является универсальной версией Hashtable. Для перечисления он использует универсальную структуру KeyValuePair<TKey, TValue> вместо DictionaryEntry.

List<T> является универсальной версией ArrayList.Существуют и универсальные классы Queue<T> и Stack<T>, которые соответствуют неуниверсальным версиям.

Существуют универсальные и неуниверсальные версии SortedList<TKey, TValue>.Обе эти версии являются гибридами словаря и списка.Универсальный классSortedDictionary<TKey, TValue> представляет собой обычный словарь и не имеет неуниверсального эквивалента.

Универсальный класс LinkedList<T> является точным связанным списком.Он не имеет неуниверсального эквивалента.

ICollection      Определяет размер, перечислители и методы синхронизации для всех нестандартных коллекций.

           IComparer      Предоставляет метод для сравнения двух объектов.

           IDictionary      Представляет небазовую коллекцию пар "ключ-значение".

           IDictionaryEnumerator Перечисляет элементы неуниверсального словаря.

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

           IEnumerator   Поддерживает простой перебор по неуниверсальной коллекции.

           IEqualityComparer       Определяет методы для поддержки операций сравнения объектов в отношении равенства.

           IHashCodeProvider      Устаревшее. Предоставляет хеш-код объекта, используя пользовательскую хеш-функцию.

           IList  Представляет неуниверсальную коллекцию объектов с индивидуальным доступом, осуществляемым при помощи индекса.

ArrayList         Реализует интерфейс IList с помощью массива с динамическим увеличением размера до нужного значения.

           BitArray           Управляет компактным битовым массивом значений, представленных логическими значениями, где значение true соответствует 1, а значение false соответствует 0.

           CaseInsensitiveComparer Проверяет равенство двух объектов без учета регистра строк.

           CaseInsensitiveHashCodeProvider           Устаревшее. Предоставляет хэш-код объекта, используя алгоритм хэширования, при котором не учитывается регистр строк.

           CollectionBase Предоставляет базовый класс abstract для строго типизированной коллекции.

           Comparer        Проверяет равенство двух объектов с учетом регистра строк.

           DictionaryBase Предоставляет базовый классabstract для строго типизированной коллекции ключ/значение.

           Hashtable        Предоставляет коллекцию пар "ключ-значение", которые упорядочены по хэш-коду ключа.

           Queue Предоставляет коллекцию объектов, которая обслуживается по принципу "первым поступил — первым обслужен".

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

           SortedList        Предоставляет коллекцию пар "ключ-значение", упорядоченных по ключам. Доступ к парам можно получить по ключу и по индексу.

           Stack

 

 

Списки

Реализует интерфейс IList с помощью массива с динамическим увеличением размера до нужного значения.

 

ArrayList myAL = new ArrayList(); myAL.Add("Hello");

 

 

Хэш-таблицы Hashtable

Предоставляет коллекцию пар "ключ-значение", которые упорядочены по хэш-коду ключа.

Каждый элемент в паре "ключ-значение" хранится в объекте DictionaryEntry. Ключ не может быть равным null, а значение — может.

Объекты, используемые коллекцией Hashtable в качестве ключей, требуются для переопределения метода Object.GetHashCode (или интерфейсаIHashCodeProvider ) и метода Object.Equals (или интерфейса IComparer ). Реализация обоих методов и интерфейсов должна одинаковым образом учитывать регистр; в противном случае действие коллекции Hashtable может быть неправильным. Например, когда создается объект Hashtable, следует использовать класс CaseInsensitiveHashCodeProvider (или любую нечувствительную к регистру реализацию интерфейса IHashCodeProvider) с классомCaseInsensitiveComparer (или любой нечувствительной к регистру реализацией интерфейса IComparer).

Более того, при вызове этих методов с одними и теми же параметрами результат должен быть одинаковым, если ключ существует в коллекции Hashtable. В качестве альтернативы можно использовать конструктор класса Hashtable с параметром IEqualityComparer. Если равенство ключей определяется просто через равенство ссылок, будет достаточно наследуемой реализации методов Object.GetHashCode и Object.Equals.

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

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

Показатель загрузки коллекции Hashtable определяет максимальное отношение количества элементов к количеству сегментов. Снижение показателя загрузки уменьшает среднее время поиска за счет увеличения объема используемой памяти. Значение показателя загрузки по умолчанию, равное 1,0, обычно обеспечивает наилучшее соотношение между объемом памяти и временем поиска. При создании коллекции Hashtable может быть задан другой показатель загрузки.

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

Каждый ключевой объект в коллекции Hashtable должен иметь свою собственную хэш-функцию, доступ к которой может быть получен при вызове методаGetHash. Однако каждый объект, реализующий интерфейс IHashCodeProvider, может быть передан в конструктор класса Hashtable, а соответствующая хэш-функция используется для всех объектов в таблице.

Емкость коллекции Hashtable — это количество элементов, которое может вместить коллекция Hashtable. Когда в коллекцию Hashtable добавляются элементы, ее емкость автоматически увеличивается должным образом посредством перераспределения.

vb#c#

В операторе foreach языка C# (for each в Visual Basic) необходима информация о типе каждого элемента коллекции. Так как каждый элемент коллекцииHashtable представляет собой пару "ключ-значение", тип элемента не является типом ключа или типом значения. Вместо этого в качестве типа элемента используется DictionaryEntry. Например:

Hashtable openWith = new Hashtable();openWith.Add("txt", "notepad.exe");foreach( DictionaryEntry de in openWith )   {       Console.WriteLine("Key = {0}, Value = {1}", de.Key, de.Value);   }

 

 


 

32. Разработка Windows-приложений с использованием технологии Windows Forms. Основные идеи технологии. Примеры эффективного применения.

 

Forms предоставляет для проекта такие компоненты, как диалоговые окна, меню, кнопки и многие другие элементы управления, являющиеся частью стандартного пользовательского интерфейса (UI) Windows. По существу, эти элементы управления являются просто классами из библиотеки .NET Framework. Представление Конструктор в Visual C#, экспресс-выпуск позволяет перетаскивать элементы управления в основную форму приложения и изменять их размеры и расположение. После этого IDE автоматически добавит исходный код для создания и инициализации экземпляра соответствующего класса.

В этом примере представлено создание приложения веб-обозревателя, которое можно настроить с использованием ссылок на избранные веб-узлы.

В этом разделе рассматривается выполнение следующих задач.

  • Создание нового приложения Windows Forms.
  • Переключение между представлением Код и представлением Конструктор.
  • Изменение свойств формы Windows.
  • Добавление элемента управления MenuStrip.
  • Добавление элемента управления Button.
  • Создание и заполнение элемента управления ComboBox.
  • Использование элемента управления WebBrowser.
  • Создание обработчиков событий для элементов управления.

Форма Windows в представлении Конструктор — это визуальное представление окна, которое появится при открытии приложения. В представленииКонструктор можно перетаскивать различные элементы управления из панели элементов в форму. Эти элементы управления не являются реальными объектами, это просто изображения, которые удобно перемещать в форме для определенного расположения.

После расположения элемента управления в форме Visual C# в фоновом режиме создаст код для правильного размещения реального элемента управления при выполнении программы. Этот исходный код будет находиться в файле Form1.designer

Возможность изменять

Добавление обработчика событий для элемента управления Button для любых элементов и событий(в свойсвах обозначается как молния).

 Обработчик событий — это метод, который выполняется при взаимодействии пользователя с элементом управления. Visual C#, экспресс-выпуск автоматически создает пустые обработчики событий.

 

private void goButton_Click(object sender, System.EventArgs e)

{

webBrowser1.Navigate(new Uri(comboBox1.SelectedItem.ToString()));

}

 

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

Просмотр созданного Visual C# кода.

IDE Visual C# автоматически создает код инициализации. В представлении Код найдите конструктор для класса Form1. У него есть подпись public Form1().

Добавление собственного кода инициализации.

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

 

private void Form1_Load(object sender, EventArgs e)

{

comboBox1.SelectedIndex = 0;

webBrowser1.GoHome();

}

 

Пример эффективного применения – простой бинарный калькулятор.

 

 

                                                                                                                                                                                      


Возможности среды CLR

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

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

Среда выполнения обеспечивает управление доступом для кода..Например, пользователи могут доверить исполняемому приложению, внедренному в веб-страницу, воспроизведение анимации на экране или звукозаписи, не позволяя ему при этом получить доступ к личным данным, файловой системе или сети.Таким образом, средства безопасности CLR предоставляют подлинному развернутому в Интернете программному обеспечению исключительно богатые функции.

Среда выполнения также обеспечивает надежность кода, реализуя инфраструктуру строгой типизации и проверки кода, которую называют системой общих типов (CTS).Система общих типов обеспечивает самоописание всего управляемого кода.Различные языковые компиляторы корпорации Майкрософт и независимых изготовителей создают управляемый код, удовлетворяющий системе общих типов .Это означает, что управляемый код может принимать другие управляемые типы и экземпляры, при этом обеспечивая правильность типов и строгую типизацию.

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

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

Хотя среда выполнения разрабатывалась для будущего программного обеспечения, она также поддерживает сегодняшнее и вчерашнее программное обеспечение.Взаимодействие управляемого и неуправляемого кодов позволяет разработчикам использовать необходимые компоненты COM и библиотеки DLL.

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

И наконец, среда выполнения может размещаться в высокопроизводительных серверных приложениях, таких как Microsoft® SQL Server™ и Internet Information Services (IIS).Такая инфраструктура позволяет использовать управляемый код для написания собственной логики программ, пользуясь при этом высочайшей производительностью лучших производственных серверов, которые поддерживают размещение среды выполнения.

Центральной частью каркаса .NET является его Общеязыковая исполняющая среда - Common Language Runtime (CLR), или .NET runtime.

Код, исполняемый под управлением CLR, часто называют управляемым кодом.

Однако перед тем как код сможет исполниться CLR, любой исходный текст (на C# или другом языке) должен быть скомпилирован. Компиляция в .NET состоит из двух шагов:

  1. Компиляция исходного кода в IL.
  2. Компиляция IL в специфический для платформы код с помощью CLR.

Этот двухшаговый процесс компиляции очень важен, потому что наличие IL(управляемого кода) - это ключ ко многим преимуществам .NET.

Промежуточное представление содержит всю необходимую информацию о программе, но не привязано к какому-либо определенному языку программирования или к машинному коду какой-либо целевой платформы. Для запуска программы необходимо специальное окружение, которое может исполнять программу (execution engine).

Важной особенностью трансляции в .NET является то, что промежуточное представление не интерпретируется; вместо этого используется механизм just-in-time компиляции, который генерирует машинный код.

 

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

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

очевидно, обеспечивает более высокую скорость выполнения приложения по сравнению

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

обычный настольный компьютер можно установить один — два недорогих диска объемом

60-120 Гбайт, этот фактор не играет существенной роли.

 

Достоинства: 1 – возможность обработки исключений 2 – универсальность использования разных языков и подключения библиотек. Недостатки: требования высокой производительности.

 


5. Атрибуты в .NET. Назначение. Привести примеры использования атрибутов.

Атрибуты предоставляют эффективный метод связывания декларативной информации с кодом (типы, методы, свойства и т. д.).Атрибут, связанный с сущностью программы, может быть запрошен во время выполнения с помощью метода, называемого отражением..Дополнительные сведения см. в разделе Отражение (C# и Visual Basic).

Атрибуты имеют следующие параметры.

  • Атрибуты добавляют в программу метаданные.Метаданные представляют собой сведения о типах, определенных в программе.Все сборки .NET содержат заданный набор метаданных, описывающих типы и члены типов, определенных в сборке.Для задания необходимых дополнительных сведений можно добавить атрибуты.Дополнительные сведения см. в разделе Создание настраиваемых атрибутов (C# и Visual Basic).
  • Один или несколько атрибутов могут применяться к сборкам, модулям или более мелким программным элементам, таким как классы и свойства.
  • Атрибуты могут принимать аргументы точно так же, как методы и свойства.
  • Программа может проверить собственные метаданные или метаданные в других программах с помощью отражения.Дополнительные сведения см. в разделе Обращение к атрибутам с помощью отражения (C# и Visual Basic).

Использование атрибутов

Атрибуты могут быть размещены в большинстве объявлений, хотя определенный атрибут может ограничить типы объявлений, в которых он допустим.В C# атрибут задается путем размещения его имени, заключенного в квадратные скобки ([]), перед объявлением сущности, к которой он относится.В Visual Basic атрибуты заключаются в угловые скобки (< >).Их необходимо помещать непосредственно перед элементом, к которому они относятся, на той же строке.

Объявление метода с атрибутом DllImportAttribute выглядит следующим образом.

using System.Runtime.InteropServices;

 

 

...

 

 

[System.Runtime.InteropServices.DllImport("user32.dll")]

extern static void SampleMethod();

 

Можно создать собственные настраиваемые атрибуты, задав класс атрибутов, который явно или косвенно наследует от Attribute, что облегчает и ускоряет определение атрибутов в метаданных.Предположим, что необходимо пометить типы именем программиста, который разработал его.Можно задать класс настраиваемых атрибутов Author:

[System.AttributeUsage(System.AttributeTargets.Class |

                  System.AttributeTargets.Struct)

]

public class Author : System.Attribute

{

private string name;

public double version;

 

public Author(string name)

{

   this.name = name;

   version = 1.0;

}

}

 

 

В качестве имени класса используется имя атрибута Author.Он является производным от System.Attribute, следовательно, это класс настраиваемых атрибутов.Параметры конструктора являются позиционными параметрами настраиваемых атрибутов.В этом примере name является позиционным параметром.Все открытые поля чтения и записи и свойства являются именованными параметрами.В данном случае version является единственным именованным параметром.Обратите внимание, что атрибут AttributeUsage используется для того, чтобы атрибут Author был действителен только для объявлений классов и struct (Structure в Visual Basic).

Новый атрибут можно использовать следующим образом:

[Author("P. Ackerman", version = 1.1)]

class SampleClass

{

// P. Ackerman's code goes here...

}

 


 

6. Библиотека классов Microsoft .NET Framework. Примеры использования библиотеки классов.


Библиотека классов .NET Framework

Библиотека классов платформы .NET Framework представляет собой коллекцию типов, которые тесно интегрируются со средой CLR.Библиотека классов является объектно-ориентированной; предоставляя типы, из которых управляемый код пользователя может наследовать функции.Это не только упрощает работу с типами .NET Framework, но также уменьшает время, затрачиваемое на изучение новых средств платформы .NET Framework.Кроме того, компоненты независимых производителей можно легко объединять с классами платформы .NET Framework.

Например, в классах коллекций .NET Framework реализуется набор интерфейсов, которые можно использовать для разработки пользовательских классов коллекций.Пользовательские классы коллекций будут без затруднений объединяться с классами .NET Framework.

Как и ожидается от объектно-ориентированной библиотеки классов, типы .NET Framework позволяют решать типовые задачи программирования, включая работу со строками, сбор данных, подключения к базам данных и доступ к файлам.В дополнение к этим обычным задачам библиотека классов содержит типы, поддерживающие многие специализированные сценарии разработки.Например, можно использовать платформу .NET Framework для разработки следующих типов приложений и служб:

  • консольные приложения;См. Построение консольных приложений.
  • приложения с графическим интерфейсом пользователя Windows (Windows Forms);См. Windows Forms.
  • приложения Windows Presentation Foundation (WPF);См. Введение в WPF.
  • приложения ASP.NET;См. Веб-страницы ASP.NET.
  • веб-службы;См. Веб-службы ASP.NET.
  • службы Windows;См. Знакомство с приложениями служб Windows.
  • сервисноориентированные приложения с помощью Windows Communication Foundation (WCF);См. раздел Windows Communication Foundation.
  • приложения поддерживающие бизнес-процессы Windows Workflow Foundation (WF).См. Windows Workflow Foundation.

В большинстве проектов разработки Visual C# интенсивно используется библиотека классов .NET Framework. С ее помощью можно решить задачи доступа к системе и управления строками, создавать элементы управления пользовательского интерфейса Windows Forms и ASP.NET.

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

Директивы using и ссылки

Прежде чем можно будет использовать классы заданного пространства имен в программе на C#, в исходный файл с кодом C# потребуется добавитьдирективу using для этого пространства имен. В ряде случаев также потребуется добавить ссылку на библиотеку DLL с этим пространством имен; Visual C# автоматически добавляет ссылки для наиболее распространенные DLL библиотек классов. Добавленные ссылки можно просмотреть в Обозревателе решений под узлом Ссылки. Дополнительные сведения см. в разделе Создание проекта (Visual C#).

После добавления директивы using для пространства имен можно создать экземпляры его типов, методов вызова и реагировать на события так, как если бы они были объявлены в собственном исходном коде. В редакторе кода Visual C# можно также поместить курсор на имя типа или члена и нажать клавишу F1 для просмотра справочной документации. Кроме того, сведения о типах по классам и структурам .NET Framework можно получить при помощи средстваОбозреватель объектов и функции Метаданные как исходный код. Дополнительные сведения см. в разделе Моделирование и анализ кода (Visual C#).


 

7. Библиотеки классов ввода/вывода пространства имен System.IO. Примеры использования.

 

Пространство имен System.IO содержит типы, позволяющие осуществлять чтение и запись в файлы и потоки данных, а также типы для базовой поддержки файлов и папок. Например перечислители FileAttributes Предоставляет атрибуты для файлов и папок. Или классы StreamReader Реализует TextReader, который считывает символы из потока байтов в определенной кодировке.

 

http://msdn.microsoft.com/ru-ru/library/system.io(v=VS.100).aspx

 

  public string getinfo(string name)

   {

       try{

       string info;

       using(System.IO.StreamReader SR =new System.IO.StreamReader("d:\\file.txt"))

       {

           while ((System.IO.SR.ReadLine()) != name) { System.IO.SR.ReadLine();}

           info= System.IO.SR.ReadLine();

       }

       return info;}

       catch{return "";}

   }

 


 

8. Взаимодействие с неуправляемым кодом из приложений Microsoft .NET. Варианты применения. Привести примеры использования.

 

Платформа ссылаться на это услуга, которая позволяет управляемому коду вызывать неуправляемые функции реализованы в динамически подключаемых библиотек (DLL), например, в Win32 API. Она находит и вызывает экспортируемую функцию и маршалы своих аргументов (числа, строки, массивы, структуры и т. д.) через взаимодействие границы по мере необходимости.

 

Вызов неуправляемого кода — это служба, которая позволяет управляемому программному коду вызывать неуправляемые функции, реализованные в библиотеках динамической компоновки (DLL), например, функции библиотек Win32 API.Вызов неуправляемого кода обнаруживает и вызывает экспортируемую функцию и при необходимости выполняет маршалинг ее аргументов (целых чисел, строк, массивов, структур и так далее) через границы взаимодействия.Дополнительные сведения об этой службе см. в разделе Подробное рассмотрение вызова неуправляемого кода.

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


Поделиться:



Последнее изменение этой страницы: 2019-03-31; Просмотров: 388; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.791 с.)
Главная | Случайная страница | Обратная связь