Лекция-02_Пр-е.ppt
- Количество слайдов: 39
Базовые принципы платформы. Net Лекция 11. 09. 12 г. 1
CLR+CTS+CLS+BCL Основа платформы. Net: Ø CLR (Common Language Runtime) – общеязыковая исполняющая среда Ø CTS (Common Type System) – общая система типов Ø CLS (Common Language Specification) – общеязыковая спецификация Ø BCL (Base Class Library) - библиотека базовых классов Главной задачей CLR является автоматически обнаруживать, загружать и управлять типами. Net(т. е. делать это вместо программиста). Кроме того, CLR заботится о ряде низкоуровневых деталей: управление памятью, создание доменов приложений, потоков и контекстных границ объектов, выполнение различных проверок на предмет безопасности и др. Спецификация CTS полностью описывает все возможные типы данных и программные конструкции, поддерживаемые исполняющей средой, указывает, как эти сущности могут взаимодействовать друг с другом и как они представляются в формате метаданных. Net. Важно понимать, что отдельно взятый совместимый с. Net язык может и не поддерживать абсолютно каждую из определенных в CTS функциональных возможностей. Лекция 11. 09. 12 г. 2
CLR+CTS+CLS+BCL Общеязыковая спецификация CLS определяет подмножество общих типов и программных конструкций, которые могут понимать абсолютно все языки программирования, поддерживающие. Net. Следовательно, в случае построения. Net -типов только с теми функциональными возможностями, которые предусмотрены в CLS, можно быть полностью уверенными в том, что все совместимые с. Net языки смогут их использовать. И, наоборот, в случае применения типа данных или конструкции программирования, которой нет в CLS, рассчитывать на то, что каждый язык программирования. Net сможет взаимодействовать с такой библиотекой кода. Net, нельзя. Библиотека базовых классов BCL не только содержит определения различных примитивов: потоков, файлового ввода-вывода, графической визуализации и взаимодействия с различными внешними устройствами, но также обеспечивает поддержку ряда служб, требуемых для большинства приложений. Например, в библиотеке базовых классов содержатся определения типов, которые упрощают доступ к базам данных, манипулирование XML-документами, обеспечение программной безопасности и создание веб-, а также обычных настольных и консольных интерфейсов. Лекция 11. 09. 12 г. 3
Схема взаимосвязи CLR, CTS, CLS и BCL Библиотека базовых классов (BCL) Доступ к базе данных Настольные графические API -интерфейсы Безопасность API-интерфейсы для удаленной работы Организация потоковой обработки Файловый вводвывод Веб-интерфейсы И другие Общеязыковая исполняющая среда (CLR) Общая система типов (CTS) Общеязыковая спецификация (CLS) Лекция 11. 09. 12 г. 4
Понятие сборки При создании файла *. dll или *. ехе с помощью. Net-компилятора, полученный модуль упаковывается в так называемую сборку (assembly). Файлы *. dll и *. exe в платформе. Net и файлы *. dll и *. exe в Win 32 представляют собой совершенно различные структуры. Сборка. Net включает: Ø Инструкции на языке CIL (Common Intermediate Language – общий промежуточный язык) Ø Метаданные Ø Манифест С концептуальной точки зрения CIL-инструкции похожи на байт-код Java: ориентированные на конкретную платформу инструкции не компилируется до тех пор, пока это не становится абсолютно необходимым. Обычно этот момент "абсолютной необходимости" наступает тогда, когда к какому-нибудь блоку CILинструкций (например, к реализации метода) выполняется обращение для его использования в исполняющей среде. Net. Лекция 11. 09. 12 г. 5
Понятие сборки Основные преимущества CIL: Ø Интеграция языков: все. Net-компиляторы выдают приблизительно идентичные CIL-инструкции. Благодаря этому все языки могут взаимодействовать в рамках четко обозначенной двоичной "арены" Ø Так как CIL не зависит от платформы, каркас. Net Framework тоже не зависит от платформы и тем самым предоставляет те же преимущества, к которым так привыкли Java-разработчики (т. е. единую кодовую базу, способную работать во многих операционных системах) Так как в сборках содержатся CIL-инструкции, а не инструкции, ориентированные на конкретную платформу, CIL-код перед использованием должен обязательно на лету компилироваться. Объект, который отвечает за компиляцию CIL-кода в инструкции целевого процессора, называется оперативным (just-in-time — JIT) компилятором. Лекция 11. 09. 12 г. 6
Понятие сборки Метаданные детально описывают особенности каждого "типа", имеющегося внутри данной двоичной. Net-единицы. Например, при наличии класса с именем Sports. Car, метаданные будут описывать, как выглядит базовый класс этого класса, какие интерфейсы реализует Sports. Car (если вообще реализует), а также, подробно, какие члены он поддерживает. За генерацию новейших и наилучших метаданных по типам всегда отвечает компилятор, а не программист. Из-за того, что метаданные. Net являются очень детальными, сборки представляют собой полностью самодостаточные (selfdescribing) сущности. Метаданные используются во многих операциях самой исполняющей среды. Net, a также в различных средствах разработки. Например, функция Intelli. Sense, имеющаяся в Visual Studio 2008, работает именно за счет считывания метаданных сборки во время проектирования. Метаданные также используются в различных утилитах для просмотра объектов, инструментах отладки и в самом компиляторе С#. Сами сборки описываются с помощью метаданных, которые называются манифестом (manifest). В манифесте содержится информация о текущей версии сборки, сведения о "культуре" (применяемые для локализации строковых и графических ресурсов) и перечень ссылок на все внешние сборки, которые требуются для правильного функционирования. Лекция 11. 09. 12 г. 7
Однофайловые и многофайловые сборки Однофайловой сборкой (single-file assembly) называется сборка, состоящая из единственного модуля *. dll или *. ехе. В однофайловых сборках все необходимые CIL-инструкции, метаданные и манифест содержатся в одном автономном четко определенном пакете. Многофайловые сборки (multifile assemblies), состоят из нескольких файлов двоичного кода. Net, каждый из которых называется модулем (module). При построении многофайловой сборки в одном из ее модулей (называемом первичным или главным (primary) модулем) содержится манифест всей сборки (и, возможно, CIL-инструкции и метаданные различных типов), а во всех остальных— манифест, CIL-инструкции и метаданные типов, охватывающие уровень только конкретного модуля. Главный модуль включает в себя также описание набора требуемых дополнительных модулей внутри манифеста сборки. Лекция 11. 09. 12 г. 8
Пример приложения на C# Лекция 11. 09. 12 г. 9
Пример приложения на C# Выполним компиляцию данного приложения с помощью csc. exe, запускаемого из командной строки, получим сборку calc. exe и запустим это приложение: Лекция 11. 09. 12 г. 10
Пример приложения на C# Исследуем сборку calc. exe с помощью утилиты ildasm. exe (дизассемблер – оконное приложение): Лекция 11. 09. 12 г. 11
Пример приложения на C# конструктор экземпляра Лекция 11. 09. 12 г. 12
Пример приложения на C# С помощью ildasm. exe можно получить полный дамп (файл calc. il): Лекция 11. 09. 12 г. 13
Общая система типов (CTS) В мире. Net "тип" представляет собой просто общий термин, который применяется для обозначения любого элемента из множества (например, класса, интерфейса, структуры, перечисления или делегата). Пять основных видов типов CTS: Ø Типы классов Ø Типы интерфейсов Ø Типы структур Ø Типы перечислений Ø Типы делегатов В каждом совместимом с. Net языке поддерживается, как минимум, понятие типа класса (class type), которое играет центральную роль в объектно-ориентированном программировании (ООП). Каждый класс может включать в себя любое количество членов (таких как свойства, методы и события) и точек данных (полей). В С# классы объявляются с помощью ключевого слова class. // Тип класса С#. class Calc { public int Add(int x, int y) { return x + y; } } Лекция 11. 09. 12 г. 14
Общая система типов (CTS) Интерфейсы представляют собой просто именованную коллекцию определений абстрактных членов, которая может поддерживаться (т. е. реализоваться) некоторыми классами или структурами. В С# типы интерфейсов определяются с помощью ключевого слова interface, например, так: public interface IDraw { void Draw(); } Лекция 11. 09. 12 г. 15
Общая система типов (CTS) Структуру (structure) можно рассматривать как "облегченный" тип класса с основанной на значениях семантикой. Обычно структуры лучше всего подходят для моделирования геометрических и математических данных, и в С# они создаются при помощи ключевого слова struct Point { // Структуры могут содержать поля. public int x. Pos, y. Pos; // Структуры могут содержать параметризованные конструкторы. public Point(int x, int у) { x. Pos = x; y. Pos = y; } // Структуры могут определять методы. public void Display() { Console. Write. Line(" ({0}, {1}", x. Pos, y. Pos); }} Лекция 11. 09. 12 г. 16
Общая система типов (CTS) Перечисления (enumeration) представляют собой удобные программные конструкции, которые позволяют группировать данные в пары "имя-значение". Перечисления создаются посредством ключевого слова enum. // Тип перечисления в С#. public enum Character. Type { Wizard = 100, Fighter = 200, Thief = 300 } Лекция 11. 09. 12 г. 17
Общая система типов (CTS) Делегаты (delegates) являются. Net-эквивалентом безопасных в отношении типов указателей функций в стиле языка С. Главное отличие заключается в том, что делегат в. Net представляет собой класс, который наследуется от System. Multicast. Delegate, a не просто указатель на какой-то конкретный адрес в памяти. В С# делегаты объявляются с помощью ключевого слова delegate. // Этот тип делегата в С# может 'указывать' на любой метод, // возвращающий целое число и принимающий два целых числа в качестве входных данных. public delegate int Binary. Op(int x, int y); Лекция 11. 09. 12 г. 18
Члены типов Формально член типа – это любой элемент множества: { конструктор, деструктор (finalizer), статический конструктор, вложенный тип, операция, метод, свойство, индексатор, поле только для чтения, константа, событие }. Спецификации CTS определяют различные "характеристики" члена типа: Ø Признак, характеризующий его доступность (общедоступный, приватный, защищенный и т. д. ) Ø Некоторые члены могут объявляться как абстрактные Ø Почти все члены также могут делаться статическими (привязываться к уровню класса) или членами экземпляра (привязываться к уровню объекта) В CTS имеется четко определенный набор фундаментальных типов данных. Хотя в каждом отдельно взятом языке для объявления того или иного встроенного (intrinsic) типа данных CTS обычно существует свое уникальное ключевое слово, все эти ключевые слова в конечном итоге приводят к одному и тому же типу, определенному в сборке mscorlib. dll. В таблице показано, как ключевые типы данных CTS выражаются в различных. Netязыках (следующий слайд). Лекция 11. 09. 12 г. 19
Фундаментальные типы данных Тип данных CTS Ключевое слово VB. NET Ключевое слово C# Ключевое слово C++/CLI System. Byte byte unsigned char System. SByte sbyte signed char System. Int 16 Short short System. Int 32 Integer int или long System. Int 64 Long long _int 64 System. UInt 16 UShort ushort unsigned short System. UInt 32 UInteger uint unsigned int или unsigned long System. UInt 64 ULong ulong unsigned _int 64 System. Single float Float System. Double double Double System. Object object Object^ System. Char char wchar_t System. String^ System. Decimal decimal Decimal System. Boolean bool Bool Лекция 11. 09. 12 г. 20
Общеязыковая исполняющая среда (CLR) В. Net имеется собственная исполняющая среда, обеспечивающая единый четко определенный уровень выполнения, который между собой разделяют все совместимые с. Net языки и платформы. Основной механизм CLR физически воплощает библиотека по имени mscoree. dll (ее также называют общим механизмом выполнения исполняемого кода объектов Common Object Runtime Execution Engine). Когда на сборку ссылаются для использования, происходит автоматическая загрузка библиотеки mscoree. dll, в результате которой в память, в свою очередь, также загружается и требуемая сборка. Механизм исполняющей среды отвечает за выполнение следующих основных задач: Ø Выяснение места расположения сборки и обнаружение запрашиваемого типа в двоичном файле за счет считывания содержащихся там метаданных Ø Размещение типа в памяти, преобразование CIL-кода в соответствующие платформе инструкции, выполнение любых необходимых проверок на предмет безопасности и потом, наконец, непосредственно выполнение самого запрашиваемого программного кода На следующем слайде показано, как выгладит схема взаимоотношений между исходным кодом (использующим типы из библиотеки базовых классов), компилятором. Net и механизмом выполнения. NET. Лекция 11. 09. 12 г. 21
Общеязыковая исполняющая среда (CLR) Компилятор. NET Исходный код. NET из совместимого С. NET языка Сборка *. dll и *. exe (с CIL-инструкциями, метаданными и манифестом) Механизм выполнения. NET (mscoree. dll) Библиотека базовых классов (mscorlib. dll и д. р. ) Загрузчик классов JIT-компилятор Соответствующие аппаратной платформе инструкции Выполнение Лекция 11. 09. 12 г. 22
Системные типы данных и их представление в C# Лекция 11. 09. 12 г. 23
Разбор простой программы на С# В отличие от многих других языков, в С# нельзя создавать ни глобальных функций, ни глобальных элементов данных. Вместо этого требуется, чтобы все члены данных и методы обязательно содержались внутри определения какого-то типа. Создадим в Visual Studio проект консольного приложения. Тогда будет сгенерирован следующий код: using System; using System. Collections. Generic; using System. Linq; using System. Text; namespace Simple. CSharp. App. B { class Program { static void Main(string[] args) { } } Здесь находится определение типа класса, который содержит единственный метод по имени Main(). По умолчанию классу, в котором определяется метод Main(), в Visual Studio присваивается имя Program } Лекция 11. 09. 12 г. 24
Разбор простой программы на С# Класс, содержащий метод Main(), должен обязательно присутствовать в каждом исполняемом приложении на С# (будь то консольная программа, настольная программа для Windows или служба Windows), поскольку он применяется для обозначения точки входа в приложение. Формально класс, содержащий метод Main(), называется объектом приложения (application object). При разрешении одному исполняемому приложению иметь более одного объекта приложения (что может быть удобно для проведения блочного тестирования), требуется обязательно информировать компилятор о том, какой из методов Main() следует использовать в качестве входной точки, указав его в командной строке с помощью опции /main. Лекция 11. 09. 12 г. 25
Разбор простой программы на С# static - область действия статических членов класса распространяется на уровень всего класса, они могут вызываться без предварительного создания нового экземпляра класса void - свидетельствует о том, что мы решили не определять возвращаемого значения string[ ] args – массив строк. Может содержать любое количество аргументов командной строки. static void Main(string[] args) { } Лекция 11. 09. 12 г. 26
Разбор простой программы на С# С# является чувствительным к регистру языком программирования. Следовательно, Main и main или Readline и Read. Line будут означать в нем совершенно разное. Поэтому следует запомнить, что все ключевые слова в С# вводятся в нижнем регистре (как, например, public, lock, global и т. д. ), а названия пространств имен, типов и членов всегда начинаются (по соглашению) с заглавной буквы, равно как и любые вложенные в них слова (как, например, Console. Write. Line, System. Windows. Forms. Message. Box, System. Data. Sql. Client и т. п. ). Как правило, при каждом получении от компилятора ошибки, связанной с "неопределенными символами", следует проверить регистр. Лекция 11. 09. 12 г. 27
Разбор простой программы на С# Модифицируем предыдущий код, переписав метод Main. Класс Console определен в пространстве имен System. В число его членов входит и статический метод Write. Line(), который позволяет отправлять строку текста и символ возврата каретки на стандартное устройство вывода static void Main(string[] args) { // Отображение простого сообщения пользователю. Console. Write. Line("***** My First C# App *****" ); Ожидание ввода Console. Write. Line("Hello World"); Console. Write. Line(); // Ожидание нажатия клавиши <Enter> перед завершением работы. Console. Read. Line(); } Лекция 11. 09. 12 г. 28
Варианты метода Мain() // Возвращаемый тип int и массив строк в качестве аргумента. static int Main(string[] args) { } //Ни возвращаемого типа, ни аргументов. static void Main() { } // Возвращаемый тип int (целое) без аргументов. static int Main() { } Лекция 11. 09. 12 г. 29
Системные типы данных и их сокращенное обозначение в С# Типы данных C#, представляют собой сокращенные варианты обозначения полноценных типов из пространства имен System. В таблице на следующем слайде перечислены эти системные типы данных вместе с их диапазонами значений, ключевыми словами С# и соответствием требованиям CLS. Лекция 11. 09. 12 г. 30
Системные типы данных и их сокращенное обозначение в С# Сокращенный вариант обозначения в C# Соответствует ли требованиям CLS Системный тип Диапазон значений Описание bool Да System. Boolean true или false Свидетельствует об истинности или ложности sbyte Нет System. SByte от -128 до 127 8 -битное число со знаком byte Да System. Byte от 0 до 255 8 -битное число без знака short Да System. Int 16 от -32768 до 32767 16 -битное число со знаком ushort Нет System. UInt 16 от 0 до 65535 16 -битное число без знака int Да System. Int 32 от -2147483648 до 2147483647 32 -битное число со знаком uint Нет System. UInt 32 от 0 до 4294967295 32 -битное число без знака Лекция 11. 09. 12 г. 31
Системные типы данных и их сокращенное обозначение в С# Сокращенный вариант обозначения в C# Соответствует ли требованиям CLS Системный тип Диапазон значений Описание long Да System. Int 64 от -9223372036854775808 до 9223372036854775807 64 -битное число со знаком ulong Нет System. UInt 64 от 0 до 18446744073709551615 64 -битное число без знака char Да System. Char от U+0000 до U+ffff Отдельный 16 -битный символ Unicode float Да System. Single от ± 1, 5 х10^-324 до ± 1, 7 х10^308 64 -битное число с плавающей запятой double Да System. Decimal от ± 1, 0 х10 e^-28 до ± 7, 9 х10 e^28 96 -битное число со знаком string Да System. String Ограничивается объемом системной памяти Представляет ряд символов в формате Unicode object Да System. Object Позволяет сохранять любой тип в объектной переменной Служит базовым классом для всех типов в мире. NET Лекция 11. 09. 12 г. 32
Объявление и инициализация переменных static void Local. Var. Declarations() { Console. Write. Line("=> Data Declarations: "); // Объявлять локальные переменные нужно так: int my. Int; Объявление переменной: тип. Данных имя. Переменной string my. String; Console. Write. Line (); } В случае использования локальной переменной до присваивания ей начального значения компилятор будет выдавать ошибку. Присваивать начальное значение локальным элементам данных можно как в одной строке, так и в двух, разделяя объявление и присваивание на два отдельных оператора кода. Лекция 11. 09. 12 г. 33
Объявление и инициализация переменных Объявление и инициализация переменной: тип. Данных имя. Переменной=нач. Значение static void Local. Var. Declarations() { Console. Write. Line("=> Data Declarations: "); int my. Int = 0; // Еще можно объявлять локальные переменные и присваивать //им начальное значение в двух отдельных строках. string my. String; my. String = "This is my character data"; Console. Write. Line(); } Лекция 11. 09. 12 г. 34
Объявление и инициализация переменных Допускается объявлять сразу несколько переменных с одним и тем же базовым типом в одной строке кода: static void Local. Var. Declarations() { Console. Write. Line("=> Data Declarations: "); int my. Int = 0; string my. String; my. String = "This is my character data"; // Объявление трех переменных типа bool в одной строке bool b 1 = true, b 2 = false, b 3 = b 1; Console. Write. Line(); } Лекция 11. 09. 12 г. 35
Объявление и инициализация переменных Допускается объявлять любой тип данных с использованием его полного имени: static void Local. Var. Declarations() { Console. Write. Line("=> Data Declarations: "); // Объявлять и инициализировать локальные переменные нужно так: // тип. Данных имя. Переменной = началъное. Значение; int my. Int = 0; string my. String; my. String = "This is my character data" ; // Объявление трех переменных типа bool в одной строке bool b 1 = true, b 2 = false, b 3 = b 1; // Объявление переменной типа bool, путем указания полного имени bool. System. Boolean b 4 = false; Console. Write. Line("Your data: {0}, {1}, {2}, {3}, {4}, {5}" , my. Int, my. String, b 1, b 2, b 3, b 4); Console. Write. Line(); } Лекция 11. 09. 12 г. 36
Выведение типа (ключевое слово var) Выведение типа объекта из контекста осуществляется с помощью ключевого слова var. Синтаксис объявления переменной при этом несколько меняется. Компилятор "выводит" тип переменной на основе того, как она инициализируется: Компилятор определяет, что some. Number должна иметь тип int some. Number = 0; эквивалентно: var some. Number = 0; Лекция 11. 09. 12 г. 37
Выведение типа (ключевое слово var) using System; namespace Var. Using { class Program { static void Main(string[] args) { var name = "Bugs Bunny"; var age = 25; var is. Rabbit = true; Type name. Type = name. Get. Type() ; Type age. Type = age. Get. Type(); Type is. Rabbit. Type = is. Rabbit. Get. Type(); Console. Write. Line("Типом name является " + name. Type. To. String()) ; Console. Write. Line("Типом age является " + age. Type. To. String ()); Console. Write. Line ("Типом is. Rabbit является " +is. Rabbit. Type. To. String()); } } } Лекция 11. 09. 12 г. 38
Выведение типа (ключевое слово var) Основные правила использования var: Ø Переменная должна быть инициализирована (иначе компилятор не сможет вывести ее действительный тип) Ø Инициализатор не может быть null, и инициализатор должен быть выражением Ø Вы не можете установить инициализатор в объект, если только не создаете этот новый объект в инициализаторе Ø Как только переменная объявлена, а тип выведен, тип этой переменной не может быть изменен. В этом состоит отличие от типа Variant, используемого в Visual Basic Ø Однажды установленный, тип переменной следует строгим правилам типизации, которым следует тип любой другой переменной Лекция 11. 09. 12 г. 39
Лекция-02_Пр-е.ppt