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


Лекция 2: Платформа .NET и ее применение для ООП



© Учебный Центр безопасности информационных технологий Microsoft

Московского инженерно-физического института (государственного университета), 2003

Комментарий к слайду

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

и рядом других компаний – разработчиков программного обеспечения (в частности,

технология JavaBeans производства Sun Microsystems), а также международных

ассоциаций, объединяющих усилия исследователей и практиков в области объектного

программирования (например, стандарт брокеров объектных запросов CORBA

организации Object Management Group, или OMG).

В основе таких попыток лежали варианты объектных моделей. Один из подобных

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

двухуровневой концептуализации, нам предстоит рассмотреть в ходе данного курса.

Сейчас же лишь кратко охарактеризуем основные отличительные особенности наиболее

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

объектных моделей.

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

именуется в литературе аббревиатурой COM (что происходит от слов Component Object

Model).

Компонентная объектная модель COM является основным стандартом Microsoft для

компонентного проектирования и реализации программного обеспечения. На сегодня это

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

практически обеспечивает возможность инициализации и использования компонентов

как внутри одного процесса, так и между процессами или между компьютерами

независимо от языка реализации. COM-модель поддерживается в идеологии .NET для

целого ряда языков программирования (C#, SML, Visual Basic, C++ и др.), является

основой для ActiveX, OLE, а также для многих других технологий Microsoft.

В отличие от СОМ, модель Java Beans, базовый стандарт Sun Microsystems для компонент,

оказывается зависимой от языка реализации.__

 


 

14. Концепция применения программных платформ. Преимущества применения программных платформ при разработке приложений (на примере Microsoft .NET)

 

 

Платформа Microsoft .NET Framework

Платформа Microsoft .NET Framework, предназначенная для работы приложений Mi-

Microsoft .NET, дает большие преимущества разработчикам программ. В частности, она

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

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

Среди других преимуществ Microsoft .NET Framework заслуживает упоминания

наличие обширной библиотеки классов, существенно облегчающей решение задач,

наиболее часто возникающих при создании автономных программ и Web-приложений.

Эта библиотека, насчитывающая десятки тысяч (!) классов, готовых к употреблению,

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

Платформа Microsoft .NET Framework обеспечивает возможность использова-

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

компонентам из разработанного ранее программного кода. В результате после от-

относительно небольших переделок старые программы смогут приобрести новую

функциональность.

Приложения Microsoft .NET работают в среде Microsoft .NET Framework в рамках

системы исполнения программ Common Language Runtime (CLR). Примененная в Mi-

Microsoft .NET Framework концепция управляемого кода обеспечит надежное и безопас-

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

ошибок в процессе программирования. Этому же способствует система обработки ис-

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

памяти, называемой системой сборки мусора (garbage collection).

Встроенные в язык С# и рассчитанные на среду Microsoft .NET Framework

средства документирования, такие, как атрибуты и операторы комментариев спе-

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

документации на программный код. Это особенно ценно при разработке больших про-

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

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

менеджера проекта.

В сочетании с мощным средством ускоренной разработки приложений Microsoft

Visual Studio .NET набор языков платформы Microsoft .NET послужит отличным под-

подспорьем при создании программ самого разного типа, как автономных, так и рассчи-

рассчитанных на использование в Интернете.

 

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

техники. Эта концепция была реализована в ОС IBM VM, созданной для «больших»

вычислительных машин (мейнфреймов) серии IBM 360/370.

ОС IBM VM разделяла физические ресурсы одного дорогостоящего компьютера

между несколькими ОС. Каждая ОС получала в пользование виртуальные ресурсы

компьютера — виртуальный диск, виртуальный процессор, виртуальную оперативную

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

на своем виртуальном компьютере (виртуальной машине).

Некоторые ресурсы (например, дисковое пространство и участки оперативной па-

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

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

на какое-то время сначала одной виртуальной машине, затем другой и т. д. При этом

создавалось впечатление, что все ОС работают одновременно.

Современные системы виртуальных машин, такие, как, например, VMWare, позво-

позволяют запускать на одном компьютере сразу несколько ОС — Microsoft Windows раз-

различных версий, MS-DOS, Linux и др. Лишь бы хватило мощности процессора, объема

дисковой и оперативной памяти.

Для нас сейчас принципиально важным является то, что программы, работающие

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

виртуальной машины. Если такая программа выполнит недопустимую операцию

и «повесит» ОС своей виртуальной машины, это никак не отразится на работоспособ-

работоспособности других виртуальных машин.

Так вот, виртуальная машина CLR, обеспечивающая работу программ платформы

Microsoft .NET Framework, закрывает доступ этим программам к ресурсам других про-

процессов, работающих на том же компьютере. В результате программа никоим образом

не сможет нарушить работоспособность остальных программ или ОС.

 

Компилятор JIT

 

Еще одним преимуществом технологии, предоставляемой в рамках платформы Micro-

Microsoft .NET Framework, перед традиционными технологиями программного обеспечения

является наличие так называемых сборок. Сборка представляет собой один или не-

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

но и для ее самодокументирования.

 

Упрощение отладки программ С#

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

времени и сил, чем на ее разработку и написание. Объем отладочного кода, создаваемого

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

объем кода самих отлаживаемых модулей.

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

программы, написанной на таких языках программирования, как C++ и Pascal, имеет

практически полный доступ к ресурсам своего процесса. Такие ошибки, как чтение

неинициализированных переменных, неправильное преобразование типов указателей

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

полученных блоков памяти, ошибки при выполнении числовых операций, могут при-

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

Многие ошибки обычно остаются незамеченными на этапе компиляции и сказыва-

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

неподходящий момент.

Компилятор языка С# исключает возникновение перечисленных выше и многих

других ошибок еще на этапе компиляции, что существенно облегчает и ускоряет про-

процесс отладки сложных программ. Необходимые для этого средства встроены непо-

непосредственно в язык С#.

Среди других средств, встроенных в язык С# и упрощающих отладку программ,

следует упомянуть объектно-ориентированную обработку исключений и систему

сборки мусора.

 

 

1. Легкость развертывания приложений в глобальной среде

Интернет

2. Экономичная разработка программного обеспечения

3. «Бесшовная», гибкая интеграция программных продуктов

и аппаратных ресурсов

4. Предоставление программного обеспечения как сервиса

5. Новый уровень безопасности и удобства использования

Компонентный подход как развитие объектно-

ориентированной модели

2. Универсальная система типизации: «всякая сущность

есть объект»; унификация данных и метаданных

3. Строго иерархическая организация кода, пространств

имен и классов

4. Универсальный интерфейс .NET Framework (включая

поддержку различных подходов к программированию)

5. Высокая вариативность экземпляров реализации (в

частности, на основе веб-сервисов)

Многоязыковая поддержка (десятки языков

программирования)


 

 

15. Массивы в языке С#. Объявление и применение массивов в языке С#, обращение к элементам массива.

 

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

type[] arrayName;

// Declare a single-dimensional array         int[] array1 = new int[5];    // Declare and set array element values   int[] array2 = new int[] { 1, 3, 5, 7, 9 };    // Alternative syntax   int[] array3 = { 1, 2, 3, 4, 5, 6 };    // Declare a two dimensional array   int[,] multiDimensionalArray1 = new int[2, 3];    // Declare and set array element values   int[,] multiDimensionalArray2 = { { 1, 2, 3 }, { 4, 5, 6 } };    // Declare a jagged array   int[][] jaggedArray = new int[6][];    // Set the values of the first array in the jagged array structure   jaggedArray[0] = new int[4] { 1, 2, 3, 4 }; int[][] jaggedArray = new int[2][];jaggedArray[0] = new int[4];jaggedArray[1] = new int[3];

В платформе .NET Framework массивы реализуются как экземпляры класса Array. Этот класс обеспечивает несколько ценных методов, например Sort иReverse.

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

 

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

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

 

 


 

16. Обработка исключений на платформе Microsoft .NET. Практическое применение.

 

Для работы с исключениями код должен быть организован особым образом. Часть кода, в которой может быть выработано исключение, заключается в блок try, а код, обрабатывающий исключение - в блок catch. Исключения могут вырабатываться самой CLR (например при попытке деления на 0) либо пользовательским методом, для чего служит ключевое слово throw после которого указывается объект-исключение, передаваемый в блок catch. Класс этого объекта должен быть производными от класса Exception. В отличие от С++ имеется блок finally. Код, заключенный в блок finally будет выполнен как при обычном завершении работы блока try, так и при вызове исключения в этом блоке. Если перед завершением функции, исполнение которой может быть прервано исключением, обязательно должны быть выполнены некоторые действия (например, закрытие ранее открытого файла), следует заключить соответствующий код в блок finally.

 

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


 

17. Объектно-ориентированный подход к программированию. Классы и объекты. Определения; Определения классов и объектов. Проблемы, решаемые этим подходом.

 

Объектно-ориентированное программирование или ООП ( object - orientedprogramming ) -- методология программирования, основанная на представлении программы в виде совокупности объектов, каждый изкоторый является реализацией определенного типа, использующая механизм пересылки сообщений и классы, организованные в иерархию наследования.

Центральный элемент ООП –абстракция. Данные с помощью абстракции преобразуются в объекты, а последовательность обработки этих данных превращается в набор сообщений, передаваемых между этими объектами. Каждый из объектов имеет свое собственное уникальное поведение. С объектами можно обращаться как с конкретными сущностями, которые реагируют на сообщения, приказывающие им выполнить какие-то действия.

ООП характеризуется следующими принципами (по Алану Кею):

- все является объектом;

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

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

- каждый объект является представителем класса, который выражает общие свойства объектов данного типа;

- в классе задается функциональность (поведение объекта); тем самым все объекты, которые являются экземплярами одного класса, могут выполнять одни и те же действия;

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

Абстрагирование ( abstraction ) -- метод решения задачи, при котором объекты разного рода объединяются общим понятием (концепцией), а затем сгруппированные сущности рассматриваются как элементы единой категории.

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

Инкапсуляция ( encapsulation ) -- техника, при которой несущественная с точки зрения интерфейса объекта информация прячется внутри него.

Наследование ( inheritance ) -- свойство объектов, посредством которого экземпляры класса получают доступ к данным и методам классов-предков без их повторного определения.

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

Полиморфизм ( polymorphism ) -- свойство, позволяющее использовать один и тот же интерфейс для различных действий; полиморфной переменной, например, может соответствовать несколько различных методов.

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

Класс ( class ) -- множество объектов, связанных общностью структуры и поведения; абстрактное описание данных и поведения (методов) для совокупности похожих объектов, представители которой называются экземплярами класса.

Объект ( object ) -- конкретная реализация класса, обладающая характеристиками состояния, поведения и индивидуальности, синоним экземпляра.

Плюсы ООП:

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

ООП дает возможность создавать расширяемые системы (extensiblesystems). Это одно из самых значительных достоинств ООП и именно оно отличает данный подход от традиционных методов программирования. Расширяемость (extensibility) означает, что существующую систему можно заставить работать с новыми компонентами, причем без внесения в нее каких-либо изменений. Компоненты могут быть добавлены на этапе выполнения.

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

 

 


 

18. Операторы ветвления на языке C#.

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






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


Поделиться:



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


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