Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
36
Добавлен:
27.03.2016
Размер:
565.76 Кб
Скачать

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

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

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

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

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

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

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

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

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

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

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

  1. Синхронизация потоков (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;

}

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

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

static void Square(int x)

{

// code...

}

static void Square(ref int x)

{

// code...

}

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

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

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

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

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

MyObj* m_pObj = GenerateMyObj();

if(!m_pObj)

return -1;

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

MyObjm_pObj = GenerateMyObj();

if(m_pObj == null)

return -1;

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

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

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

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

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

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

Различают:

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

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

  1. Структуры данных на платформе 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.Дополнительные сведения об этих классах содержатся в разделе Часто используемые типы коллекций.

Соседние файлы в папке Мулаточки 18+