Эндрю Троелсен - ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание
- Название:ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание
- Автор:
- Жанр:
- Издательство:Издательский дом Вильямс
- Год:2007
- Город:Москва • Санкт-Петербург • Киев
- ISBN:ISBN 5-8459-1124-9
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Эндрю Троелсен - ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание краткое содержание
В этой книге содержится описание базовых принципов функционирования платформы .NET, системы типов .NET и различных инструментальных средств разработки, используемых при создании приложений .NET. Представлены базовые возможности языка программирования C# 2005, включая новые синтаксические конструкции, появившиеся с выходом .NET 2.0, а также синтаксис и семантика языка CIL. В книге рассматривается формат сборок .NET, библиотеки базовых классов .NET. файловый ввод-вывод, возможности удаленного доступа, конструкция приложений Windows Forms, доступ к базам данных с помощью ADO.NET, создание Web-приложений ASP.NET и Web-служб XML. Книга содержит множество примеров программного кода, призванного помочь читателю в освоении предлагаемого материала. Программный код примеров можно загрузить с Web-сайта издательства.
ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
ldarg.1 // Загрузка 'а' в стек.
ldarg.2 // Загрузка 'b' в стек.
…
}
Представление итерационных конструкций
Итерационные конструкции в языке программирования C# представляются с помощью ключевых слов for, foreach, while и do, каждое из которых имеет свое специальное представление в CIL. Рассмотрим классический цикл for.
public static void CountToTen() {
for (int i = 0; i ‹ 10; i++);
}
Вы можете помнить о том, что коды операций br (br, blt и т.д.) используются для управления потоком программы в зависимости от выполнения некоторого условия. В нашем примере мы задали условие, по которому должен произойти выход из цикла, когда значение локальной переменной i станет равным 10. С каждым проходом к значению i добавляется 1, после чего сразу же выполняется тестовое сравнение.
Также напомним, что при использовании любых кодов операций CIL, связанных с ветвлением, нужно определить метку для обозначения в программном коде места, куда следует перейти в случае выполнения условия. С учетом этого рассмотрите следующий (расширенный) программный код CIL, сгенерированный с помощью ildasm.exe (включая и метки программного кода).
.method public hidebysig static void CountToTen() cil managed {
.maxstack 2
.locals init ([0] int32 i) // Инициализация локальной целой 'i'.
IL_0000: ldc.i4.0 // Загрузка этого значения в стек.
IL_0001: stloc.0 // Сохранение значения под индексом '0'.
IL_0002: br.s IL_0008// Переход к IL_0008.
IL_0004: ldloc.0 // Загрузка значения с индексом 0.
IL_0005: ldc.i4.1 // Загрузка значения '1' в стек.
IL_0006: add // Добавление в стек под индексом 0.
IL_0007: stloc.0
IL_0008: ldloc.0 // Загрузка значения с индексом '0'.
IL_0009: ldc.i4.s 10 // Загрузка значения '10' в стек.
IL_000b: blt.s IL_0004// Меньше? Если да, то к 1L_0004.
IL_000d: ret
}
В сущности, этот программный код CIL начинается с определения локальной переменной int32 и загрузки ее в стек. Затем осуществляются переходы между командами с метками IL_0008 и IL_0004, причем каждый раз значение i увеличивается на 1 и проверяется, осталось ли это значение меньше 10. Если нет, то происходит выход из метода.
Создание компоновочного блока .NET в CIL
Теперь, освоив синтаксис и семантику CIL, вы можете закрепить свои знания на практике, построив приложение .NET с использованием только CIL и текстового редактора. Ваше приложение будет состоять из приватного одномодульного *.dll, содержащего два определения типов класса, и консольного *.exe, взаимодействующего с этими типами.
Создание CILCars.dll
Первым делом следует построить файл *.dll для использования клиентом. Откройте любой текстовый редактор и создайте новый файл *.il с именем CILCars.il. Этот одномодульный компоновочный блок будет использовать два внешних двоичных файла .NET, поэтому вы можете начать свой файл программного кода CIL так.
// Ссылка на mscorlib.dll и
// System.Windows.Forms.dll
.assemblу extern mscorlib {
.publickeytoken = (B7 7A 5С 56 19 34 E0 89)
.ver 2:0:0:0
}
.assembly extern System.Windows.Forms {
.publickeytoken = (B7 7A 5C 56 19 34 E0 89)
.ver 2:0:0:0
}
// Определение одномодульного компоновочного блока.
.assembly CILCars {
.hash algorithm 0х00008004
.ver 1:0:0:0
}
.modulе СILCars.dll
Как уже было сказано, этот компоновочный блок будет содержать два типа класса. Первый тип, CILCar, определяет два поля данных и пользовательский конструктор. Второй тип, CarInfoHelper, определяет единственный статический метод с именем DisplayCarInfо(), который использует CILCar в качестве параметра и возвращает void. Оба типа находятся в пространстве имен CILCars. В терминах CIL класс CILCar можно реализовать так.
// Реализация типа CILCars.CILCar.
.namespace CILCars {
.class public auto ansi beforefieldinit CILCar extends [mscorlib]System.Object {
// Поле данных CILCar.
.field public string petName
.field public int32 currSpeed
// Пользовательский конструктор, который дает пользователю
// возможность присвоить полю данные.
.method public hidebysig specialname rtspecialname instance void .ctor(int32 c, string p) cil managed {
.maxstack 8
// Загрузка первого аргумента в стек и вызов
// конструктора базового класса.
ldarg.0 // объект 'this', а не int32!
call instance void [mscorlib]System.Object::.ctor()
// Теперь загрузка первого и второго аргументов в стек.
ldarg.0 // объект 'this'
ldarg.1 // аргумент int32
// Сохранение элемента вершины стека (int 32) в поле currSpeed.
stfld int32 CILCars.CILCar::currSpeed
// Загрузка строкового аргумента и сохранение в поле petName.
ldarg.0 // объект 'this'
ldarg.2 // аргумент string
stfld string CILCars.CILCar::petName
ret
}
}
}
Имея в виду, что настоящим первым аргументом любого нестатического члена является объектная ссылка this, в первом блоке CIL-кода мы просто загружаем эту объектную ссылку и вызываем конструктор базового класса. Затем поступающие аргументы конструктора помещаются в стек и запоминаются в полях данных типа с помощью кода операции stfld (сохранение в поле).
Далее, вы должны реализовать второй тип в данном пространстве имен, а именно тип CILCarInfo. Суть типа находится в статическом методе Display(). Основной задачей этого метода является получение поступающего параметра CILCar, извлечение значения поля данных и вывод его в окне сообщения Windows Forms. Вот полная реализация CILCarInfo, а далее следует ее анализ.
.class public auto ansi beforefieldinit CILCarInfo extends [mscorlib]System.Object {
.method public hidebysig static void Display(class CILCars.CILCar c) cil managed {
.maxstасk 8
// Нам нужна локальная строковая переменная.
.locals init ([0] string caption)
// Загрузка строки и входного CILCar в стек.
ldstr "Скорость [0]: "
ldarg.0
// Помещение значения petName класса CILCar в стек и
// вызов статического метода String. Format().
ldfld string CILCars.CILCar::petName
call string [mscorlib]System.String::Format(string, object)
stloc.0
// Загрузка значения поля currSpeed и получение его строкового // представления (обратите внимание на вызов ToString()).
ldarg.0
ldflda int32 CILCars.CILCar::currSpeed
call instance string [mscorlib]System.Int32::ToString()
ldloc.0
// Вызов метода MessageBox.Show() с загруженными значениями.
call valuetype [System.Windows.Forms] System.Windows.Forms.DialogResult [Sуstem.Windоws.Forms] System.Windows.Forms.MessageBox::Show(string, string)
pop
ret
}
}
Хотя здесь объем программного кода CIL заметно больше, чем в случае реализации CILCar, на самом деле все довольно просто. Во-первых, поскольку вы определяете статический метод, вам не придется иметь дел со скрытой объектной ссылкой (поэтому код операции ldarg.0 действительно загружает поступающий аргумент CILCar).
Читать дальшеИнтервал:
Закладка: