Перспективные технологии и языки веб-разработки

Разработка серверных web-приложений на С#

Разбить на страницы
Показывать лекцию целиком

Теоретический материал

MicrosoftVisualStudio .NET - это интегрированная среда разработки для создания, документирования, запуска и отладки программ, написанных на языках .NET.

Эта среда разработки является открытой языковой средой. Наряду с языками программирования, изначально включенными в среду - C++, C#, J#, Visual Basic, - в нее могут добавляться любые языки программирования, компиляторы которых создаются сторонними разработчиками. Необходимым условием для включения языков в среду VisualStudio .NET является использование единого каркаса - платформы Framework.Net.

Платформа Framework.NET позволяет:

  • легко использовать компоненты, разработанных на различных языках;
  • разрабатывать единое приложение из нескольких частей на разных языках;
  • Для разработки приложений в Visual Studio.NET используются проекты.

    Проект (Project) - это основная единица, с которой имеет дело разработчик. Сначала он должен выбрать тип проекта, после чего Visual Studio создает каркас проекта в соответствии с выбранным типом.

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

    Несколько проектов могут объединяться в решение (Solution), которое также может включать ресурсы, необходимые этим проектам.

    С точки зрения разработчика конечным результатом его работы, получаемым после компиляции исходного программного кода, является решение, а с точки зрения CLR (Common Language Runtime - общеязыковой среды исполнения) - сборка (assembly), содержащая PE файл, т.е. модуль в формате исполняемого файла PE (Portable Executable) для 32-разрядной ОС Windows либо DLL (Dynamic Link Library) файл.

    Visual Studio.Net предлагает большое разнообразие возможных типов проектов. Для ознакомления с основами языка С# в основном будут использованы консольные приложения без привлечения привычных в Windows возможностей пользовательского интерфейса.

    В C# нет глобальных функций, поэтому по умолчанию при создании консольного приложения объявляется класс Program, который содержит функцию static Main(), служащую начальной точкой выполнения программы. Функция Main может быть объявлена без параметров или с параметром, представляющий собой массив строк.

    Также программа на C# может содержать комментарии и атрибуты.

    В C# используются однострочные и многострочные комментарии. Однострочный комментарий начинается с пары символов "//", и весь текст до конца строки является комментарием. Многострочный комментарий начинается с пары символов /* и заканчивается */.

    Атрибут - средство добавления декларативной информации к элементам программного кода. Назначение атрибутов: организация взаимодействия между программными модулями, дополнительная информация об условиях выполнения кода, управление сериализацией (т.е. правила сохранения информации), отладка, и др. Атрибуты могут быть как стандартными, так и заданными пользователем. Стандартные атрибуты используются CLR и влияют на то, как будет выполняться проект. Атрибут размещается в скобках "[]".

    1. Типы данных C#.

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

  • Логический тип (bool).
  • Символьный тип (char).
  • Целые типы. Они могут отличаться размером: short, int, long, а также могут быть знаковыми (signed) или беззнаковыми (unsigned).
  • Типы с плавающей точкой. Они также могут отличаться размерами: float, double и long double.
  • Тип void указывает на отсутствие информации.

    К конструируемым типам относятся следующие:

  • Указатели (например, char*).
  • Ссылки (например, char).
  • Массивы (например, char[]).

    Также язык позволяет разработчику конструировать собственные типы:

  • Перечислимые типы (enum).
  • Структуры (struct).
  • Классы.
  • В языке C# все типы можно рассматривать и под другим ракурсом, разделив их на четыре категории:

  • Типы-значения (value).
  • Ссылочные (reference).
  • Указатели (pointer).
  • Тип void.
  • Для ссылочного типа значение задает ссылку на область памяти в "куче" (heap), где расположен соответствующий объект. Для типа-значения значением являются собственно данные, а память для них выделяется в стеке.

    Логический, арифметический, структуры, перечисление относятся типам-значениям. Массивы, строки и классы относятся к ссылочным типам.

    И ссылочные, и обычные типы являются производными от базового класса object. В тех случаях, когда обычный тип должен вести себя как объект, создается оболочка (wrapper), которую можно рассматривать как ссылочный объект, помещенный в кучу, и в нее копируется значение переменной обычного типа. Оболочка автоматически помечается таким образом, что система знает, какое значение она содержит. Этот процесс назывется упаковкой (boxing), а обратный процесс - распаковкой (unboxing).

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

    7.ToString();
    

    целое число 7 упаковывается путем вызова функции Int32.ToString().

    Массивы в C# могут быть многомерными (multidimensional) или невыровненными (jagged). Более сложные структуры данных такие, как стек и хеш-таблица определены в пространстве имен System.Collections.

    2. Выражения и операторы C#.

    Выражения строятся из операндов - констант, переменных, функций, - объединенных знаками операций и скобками. При вычислении выражения определяется его значение и тип.

    В таблице ниже приведен список операций C#.

    Категория операций Операции
    Арифметические + - * / %
    Логические (boolean и побитовые) | ^ ! ~ ||
    Строковые +
    Инкремент и декремент ++ --
    Сдвиг >> <<
    Сравнение == != < > <= >=
    Присвоение = += -= *= /= %= = |= ^= <<= >>=
    Обращение к члену класса .
    Индексация []
    Приведение типа (Cast) ()
    Условие ?:
    Создание объекта new()
    Информация о типе is sizeof typeof
    Управление исключениями checked unchecked
    Косвенности и адресации * -> []

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

    По используемым выражениям и операторам C# похож на C++. Так в программах на C# используются такие операторы как:

  • Оператор присваивания (=)
  • Составной оператор ({})
  • Операторы выбора: if-else и switch
  • Операторы цикла: for, while, оператор
  • Операторы break и continue
  • Оператор return
  • Оператор перехода goto
  • Кроме того, введены несколько новых инструкций. Например, оператор foreach позволяет получить доступ ко всем элементам массива или коллекции поочередно, в порядке возрастания индексов. Его синтаксис:

    foreach (тип идентификатор in контейнер) оператор
    

    В C# процедуры и функции существуют только как методы некоторого класса, они не определены вне класса. Роль библиотек процедур и функций выполняют библиотеки классов. Библиотека классов Framework Class Library (FCL), доступная в языке C#, существенно расширяет возможности языка.

    3. Классы и методы в C#.

    В Visual Studio.Net, и в C# в частности, любая программная система рассматривается как совокупность классов, объединенных в проекты, пространства имен, решения.

    Описание класса имеет следующий синтаксис:

    [атрибуты][модификаторы]class имя_класса[:список_родителей] {тело_класса}
    

    В теле класса могут быть объявлены:

  • константы;
  • поля;
  • конструкторы и деструкторы;
  • методы;
  • события;
  • делегаты;
  • классы (структуры, интерфейсы, перечисления).
  • Поля класса синтаксически являются обычными переменными (объектами) языка. Их описание удовлетворяет обычным правилам объявления переменных. Поля характеризуют свойства объектов класса.

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

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

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

    [<спецификатор доступа>] delegate <тип результата> <имя класса> (<список аргументов>);
    

    4. Массивы

    Язык C# предоставляет средства для работы с одномерными массивами, массивами массивов и многомерными массивами.

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

    // Объявление массива размерности 3 из элементов типа int.
    // Фактически это массив составляющих, представляющих собой массивы 
    // размерности 2 одномерных массивов элементов типа int.
    // Размеры всех составляющих массивов одного уровня равны
    // между собой ("прямоугольный" массив).
    
    int[,,] ar1; 
    
    // Объявление одномерного массива из 
    // одномерных массивов элементов, каждый из которых является 
    // одномерным массивом элементов типа int.
    
    int[][][] ar2;
    
    // Объявление одномерного массива составляющих, каждый из которых является 
    // двумерным массивом массивов элементов типа int.
    // При этом у всех составляющих могут быть разные размеры
    
    int[][,] ar3;
    
    // Объявление двумерного массива составляющих, каждая из которых является 
    // одномерным массивом элементов типа int.
    // При этом у всех составляющих могут быть разные размеры.
    
    int[,][] ar4;
    

    Рассмотренные примеры демонстрируют определение двух различных категории массивов:

  • прямоугольные массивы,
  • ломаные (jagged) массивы.
  • Объявление массива может быть совмещено с инициализацией. При объявлении с отложенной инициализацией сам массив не формируется, а создается только ссылка на массив, имеющая неопределенное значение Null. Поэтому пока массив не будет реально создан и его элементы инициализированы, использовать его нельзя.

    Возможны два варианта объявления массива совмещенного с инициализацией.

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

    int[] odd = {1, 3, 5, 7, 9};
    

    Во втором случае создание и инициализация массива реализуется вместе с вызовом конструктора массива. Например:

    int[] even = new int[5];
    

    Все массивы являются потомками класса System.Array, который в свою очередь наследует ряд интерфейсов: ICloneable, IList, ICollection, IEnumerable, а, следовательно, реализует все их методы и свойства. Кроме того, класс Array имеет большое число собственных методов и свойств.

    Благодаря наследованию от класса System.Array, для массивов определены такие встроенные методы копирования, поиска, обращения, сортировки. Массивы можно рассматривать также как как коллекции и использовать цикл foreach для перебора его элементов.

    Ниже приведены основные свойства и методы класса System.Array:

    Свойство Описание
    IsFixedSize Возвращает true, если массив является статическим
    IsReadOnly Для всех массивов возвращает значение false
    IsSynchronized Возвращает true или false, в зависимости от того, установлена ли синхронизация доступа для массива
    Length Число элементов в массиве
    Rank Размерность массива
    Метод Описание
    BinarySearch Бинарный поиск элементов
    Clear Выполняет инициализацию элементов. Числовые элементы становятся нулевыми, а строковые принимают значение Null
    Clone Клонирование массива
    Copy Копирование части или всего массива в другой массив
    CopyTo Копируются все элементы одномерного массива в другой одномерный массив, начиная с заданного индекса
    CreateInstance Создание экземпляра массива
    GetEnumerator Возварщает интерфейс IEnumerator. Необходим для использования в цикле foreach
    GetLength Возвращает число элементов массива по указанному измерению
    GetLowerBound, GetUpperBound Возвращает нижнюю и верхнюю границу по указанному измерению. Для массивов нижняя граница всегда равна нулю.
    GetValue SetValue Возвращает или устанавливает значение элемента массива с указанными индексами.
    IndexOf Индекс первого вхождения образца в массив
    LastIndexOf Индекс последнего вхождения образца в массив
    Reverse Сортировка одномерного массива в обратном порядке
    Sort Сортировка массива

    5. Строки

    В языке C# определен класс сhar[], и его можно использовать для представления строк постоянной длины. Однако массив сhar[] - это обычный массив, поэтому его нельзя инициализировать строкой символов. В C# не определено преобразование из класса сhar[] в класс String. У String есть динамический метод ToCharArray, задающий подобное преобразование в сhar[].

    Объекты класса String объявляются с явной или отложенной инициализацией, с явным или неявным вызовом конструктора класса. Чаще всего, при объявлении строковой переменной конструктор явно не вызывается, а инициализация задается строковой константой. У класса String достаточно много конструкторов, которые позволяют сконструировать строку из:

  • символа, повторяющегося указанное число раз;
  • массива символов char[];
  • части массива символов.
  • Методы класса String позволяют выполнять вставку, удаление, замену, поиск вхождения подстроки в строку. Класс String наследует методы класса Object, а также методы четырех интерфейсов: IComparable, ICloneable, IConvertible, IEnumerable.

    Некоторые из членов класса приведены в таблице:

    Метод Описание
    Length Это свойство возвращает длину указанной строки
    Insert Вставляет подстроку в заданную позицию
    Remove Удаляет подстроку в заданной позиции
    Replace Заменяет подстроку в заданной позиции на новую подстроку
    Substring Выделяет подстроку в заданной позиции
    IndexOf, IndexOfAny, LastIndexOf, LastIndexOfAny Определяются индексы первого и последнего вхождения заданной подстроки или любого символа из заданного набора
    StartsWith, EndsWith Возвращается true или false, в зависимости от того, начинается или заканчивается строка заданной подстрокой
    PadLeft, PadRight Выполняет заполнение нужным числом пробелов в начале и в конце строки
    Trim, TrimStart, TrimEnd Удаляются пробелы в начале и в конце строки, либо только с одного конца
    ToCharArray Преобразование строки в массив символов

    Класс String не разрешает изменять существующие объекты. Для этой цели имеется другой класс - класс StringBuilder, который позволяет исправить данный недостаток. Этот класс принадлежит к изменяемым классам и его можно найти в пространстве имен System.Text.

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

  • Первая группа позволяет задать строку или подстроку, значением которой будет инициализироваться создаваемый объект класса StringBuilder.
  • Вторая группа параметров позволяет задать размер объекта, т.е объем памяти, отводимой для экземпляру класса StringBuilder.

    Примеры конструкторов:

  • public StringBuilder(string str, int size). Параметр str задает строку для инициализации, size - размер объекта;
  • public StringBuilder(int cursize, int maxsize). Параметры cursize и maxsize задают начальный и максимальный размер объекта;
  • public StringBuilder(string str, int start, int len, int size). Параметры str, start, len задают строку инициализации, size - размер объекта.
  • Над строками этого класса определены (также как идля строк класса String) операции:

  • присваивание (=);
  • две операции проверки эквивалентности (==) и (!=);
  • взятие индекса ([]).
  • Операция конкатенации (+) не определена над строками класса StringBuilder, ее роль играет метод Append, добавляющий новую строку в конец существующей.

    6. Интерфейсы

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

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

    Среди интерфейсов, встроенных в библиотеку базовых классов .NET, можно особо выделить такие как:

  • IEnumerable (для работы с наборами объектов, в т.ч. с использованием оператора foreach).
  • IClonable (копирование объектов).
  • IComparable (для сравнения и сортировки объектов).
  • Пространство имен System.Collections, предназначенное для работы с наборами объектов, поддерживает интерфейсы:

  • ICollection (определяет общие характеристики класса набора элементов).
  • IComparer, IDictionary (позволяет представлять содержимое объекта в виде пар имя-значение).
  • IDictionaryEnumerator (нумерация содержимого объекта, поддерживающего IDictionary).
  • IEnumerable, IEnumerator.
  • IHashCodeProvider (возвращает хэш-код с помощью выбранного алгоритма хэширования).
  • IList (обеспечивает методы добавления, удаления и индексирования элементов в списке объектов).
  • 7. Visual Web Developer Express

    Visual Web Developer Express - это полнофункциональная среда разработки, предназначенная для создания веб-приложений ASP.NET, называемых "веб-узлами".

    Visual Web Developer Express (VWDE) предоставляет в распоряжение веб-разработчика следующие функциональные возможности:

  • Конструирование веб-страниц. Мощный редактор веб-страниц, который имеет режим представления WYSIWYG и режим редактирования HTML с поддержкой технологии IntelliSense и возможностью проверки кода.
  • Функции конструирования страниц. Целостный макет узла с главными страницами и целостное отображение страниц с темами и обложками.
  • Редактирование кода. Редактор кода, который позволяет писать код для динамических веб-страниц на Visual Basic или C#. Редактор кода имеет функции синтаксической разметки и IntelliSense.
  • Отладка. Отладчик, помогающий находить ошибки в создаваемых программах.
  • Элементы управления. Расширенный набор серверных веб-элементов управления ASP.NET, включающих большую часть функциональности, необходимой для создания веб-узлов.
  • Доступ к данным. Поддержка отображения и редактирования данных на веб-страницах. Данные могут находиться в различных хранилищах, включая базы данных и XML-файлы. Во многих случаях можно добавлять данные, отображать их и редактировать прямо на веб-страницах без необходимости написания кода.
  • Безопасность, персонализация и прочее. Встроенные службы приложений, которые позволяют добавлять к веб-узлу функцию членства для обеспечения безопасности при входе, свойства профилей, которые позволяют хранить индивидуальную информацию пользователей, и другие функции, в большинстве из которых не требуется писать код.
  • Разработка для размещенных веб-узлов. Средства для публикации узлов на размещенном веб-узле, в том числе и на локальных веб-серверах для тестирования.
  • Visual Web Developer Express (VWDE) представляет собой удобную среду для построения веб-узлов и их публикации. Используя инструменты разработки VWDE, можно разрабатывать веб-узлы ASP.NET на собственном компьютере. В состав VWDE входит локальный веб-сервер, который обеспечивает все функции, необходимые для тестирования и отладки веб-узлов ASP.NET, и не требует установки сервера IIS.

    В VWDE можно произвести предварительную компиляцию и развернуть веб-узел при помощи команды "Построить веб-узел" (Build Web Site). Команда "Построить веб-узел" запускает компилятор для всего веб-узла, а не только для файлов кода, и создает макет веб-узла, который можно развертывать уже на рабочем сервере.

    Visual Web Developer Express предоставляет в распоряжение веб-разработчика целый набор шаблонов ASP.NET 2.0. По-сути - это готовые веб-узлы, которые можно использовать в качестве собственных веб-узлов с минимальными изменениями. Чтобы использовать шаблон, необходимо создать новый новый веб-узел и выбрать требуемый шаблон.

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

    Порядок выполнения лабораторной работы

    Для практического изучения примеров в данной лабораторной работе необходимо наличие установленного пакета Microsoft Visual Studio (версии не ранее 2003). В зависимости от установленной версии возможны несущественные отличия в интерфейсе среды при создании и работе с проектом консольного приложения.

    Задание 1. Создание проекта консольного приложения.

  • Первый шаг при разработке любого приложения - создание проекта. Для этого через разделы меню: File > New > Project запускается панель создания нового проекта следующего вида:
  • Из списка предлагаемых шаблонов необходимо выбрать проект консольного приложения (Console Application).
  • После создания проекта должно появиться следующее окно, содержащее текст программы Program.cs на языке C#:

    В данной программе объявление using System дает возможность ссылаться на классы, которые находятся в пространстве имен System, так что их можно использовать, не добавляя "System." перед именем типа.

    Пространство имен System содержит много полезных классов. Одним из них является и класс Console, который используется при создании консольных приложений.

    Класс проекта - Program размещен в пространстве имен, имеющем по умолчанию то же самое имя (HelloWorldDemo), что и решение, содержащее в данном примере единственный проект.

    Поскольку в C# нет глобальных функций, поэтому в данном примере объявляется класс Program, который содержит функцию static Main(), служащую начальной точкой выполнения программы. Функция Main может быть объявлена без параметров или с параметром, представляющий собой массив строк. Так как функция Main является точкой входа, она должна быть статической (static) функцией, т.е. она не связана с конкретным объектом класса, в котором объявлена.

  • Добавим внутри функции Main следующую строку:
    Console.WriteLine("Hello world!");
    

    которая использует метод WriteLine класса Console для вывода строки "Hello world!".

  • Компиляция проекта. Для можно использовать либо меню (Build > Build Имя проекта) или сочетание клавиш <Shift+F6>. При наличии сообщений об ошибках необходимо их исправить и скомпилировать проект снова.
  • Запуск приложения. Для можно использовать либо меню (Debug > Start Without Debugging) или сочетание клавиш <Ctrl+F5>. В результате получим следующее консольное окно:
  • Усложним приложение. Для этого добавим в функцию Main следующий код для вывода в консольное окно содержимого массива целых чисел:
    static void Main(string[] args)
    {
    int[] ArInt = { 0, 9, 1, 8, 2, 7, 3, 6, 4, 5 };
    
    Console.WriteLine("Array contains elements:");
    foreach (int item in ArInt)
    {
    Console.Write("{0} ", item);
    }
    Console.WriteLine("");
    }
    

    После повторения шагов 3-4 получим следующее окно:

  • Задание 2. Работа с массивами.

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

  • Прямоугольный массив.
    
    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace HelloWorldDemo
    {
    class Program
    {
    static void Main(string[] args)
    {
    // Прямоугольный многомерный массив
    int[,]multMatr;
    multMatr = new int[10,10];
    
    // Заполнение массива 9 на 9:
    for (int i = 1; i <= 9; i++)
    for (int j = 1; j < 9; j++)
    multMatr[i, j] = i * j;
    
    // Вывод элементов многомерного массива 
    for (int i = 1; i <= 9; i++)
    {
    for (int j = 1; j <= 9; j++)
    {
    Console.Write(multMatr [i, j] + "\t");
    }
    Console.WriteLine();
    }
    }
    }
    

    В результат выполнения программы получим таблицу умножения следующего вида:

  • Ломаный массив.
    
    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace HelloWorldDemo
    {
    class Program
    {
       static void Main(string[] args)
       {
    // Ломаный многомерный массив из пяти внутренних массивов разного размера 
    int[][] JagArr = new int[10][];
    
    // Инициализация генератора случайных чисел
    Random rand = new Random();
    
    // Динамическое создание ломаного массив
    for (int i = 0; i < JagArr.Length; i++)
    {
    JagArr[i] = new int[i + rand.Next(10)];
    }
    
    // Вывод строк на консоль 
    // Каждый элемент по умолчанию имеет значение, равное  
    for (int i = 0; i < 10; i++)
    {
    // Свойство Length массива возвращает его размер
    Console.Write("Length of row {0} is {1}:\t", i, JagArr[i].Length);
    for (int j = 0; j < JagArr[i].Length; j++)
    {
    Console.Write(JagArr[i][j] + " ");
    }
    Console.WriteLine();
    }
       }
    }
    
    }
    

    В результате выполнения программы получим следующую таблицу:

  • Свойства и методы класса Array.

    Следующий пример демонстрирует использование некоторых из свойств и методов класса Array:

    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace HelloWorldDemo
    {
        class Program
        {
            static void Main(string[] args)
            {
         // Массив символьных строк
                string[] Brands = new string[]
    				{"Audi",
                    "BMW",
                    "Buick",
                    "Chevrolet",
                    "Citroen",
                    "Dodge",
                    "Ferrari",
                    "Fiat",
                    "Ford",
                    "Honda",
                    "Hyundai",
                    "Cherokee",
                    "Cherry",
                    "Lada",
                    "Lamborghini",
                    "Lincoln",
                    "Mazda",
                    "Mercedes",
                    "Mitsubishi",
                    "Nissan",
                    "Opel",
                    "Peugeot",
                    "Plymoth",
                    "Pontiac",
                    "Renault",
                    "Rover",
                    "Saab",
                    "Subaru",
                    "Suzuki",
                    "Toyota",
                    "Volkswagen",
                    "Volvo"};
    
    	// Вывод марок автомобилей в соответствии с порядком элементов в массиве
     
    			Console.WriteLine("Here is the array of car brands:");
    
    			for (int i = 0; i < Brands.Length; i++)
    				Console.Write(Brands[i] + "\t");
    
                Console.Write("\n\n");
    
    	// Сортировка элементов в обратном порядке 
    	
    			Array.Reverse(Brands);
    
    	// Вывод автомарок 
    			Console.WriteLine("Here is the list once reversed:");
    			for (int i = 0; i < Brands.Length; i++)
    				Console.Write(Brands[i] + "\t");
    
                Console.Write("\n\n");
    
    	// Остаются только первый и последний
    
    			Console.WriteLine("Only two remain: ");
    			Array.Clear(Brands, 2, Brands.Length-2);
    
    			for (int i = 0; i < Brands.Length; i++)
    			{
    				Console.Write(Brands[i] + "\t\n");
    			}
    		}
        
        }
    }
    

    Результат работы программы:

    Использование класса StringBuilder

    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace HelloWorldDemo
    {
    class Program
    {
    static void Main(string[] args)
    {
    StringBuilder WordList = new StringBuilder("Каждый Охотник ");
    
    WordList.Append("Желает Знать Где ");
    Console.WriteLine(WordList);
    
    WordList.Append("Сидит Фазан");
    Console.WriteLine(WordList);
    
    // Сделать все буквы прописными
    string Spectrum = WordList.ToString().ToUpper();
    Console.WriteLine(Spectrum);
    }
    }
    }
    

    Результат работы программы:

    Использование класса ArrayList

    Использование класса ArrayList из пространства имен System.Collections позволяет эффективно реализовать работу с массивами объектов, поскольку многие возможности, необходимые для этого реализованы изначально, в частности методы вставки, удаления и нумерации элементов.

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

    public class NBooks : IEnumerable
    {
    // nbList - внутренний класс, который будет делать всю работу 
    	private ArrayList nbList;
    
    // Создаем объект класса nbList при помощи конструктора NBooks 
    	public NBooks() {nbList = new ArrayList();}
    
    // Реализуем нужные нам методы для приема вызовов извне и передачи их nbList 
    		
    	// Метод для вставки объекта NBook
    	public void AddNBook(NBook nb)
    	{ nbList.Add(nb); }
    
    // Метод для удаления объекта NBook
    	public void RemoveNBook(int nbToRemove)
    	{ nbList.RemoveAt(nbToRemove); }
    
    // Свойство, возвращающее количество объектов NBook
    	public int NBookCount
    	{ get { return nbList.Count; } }
    
    // Метод для очистки объекта - удаления всех объектов NBook 
    	public void ClearAllNBooks()
    	{ nbList.Clear(); }
    
    // Метод, который отвечает на вопрос - есть ли уже в наборе такой объект NBook 
    	public bool NBookIsPresent(NBook c)
    	{ return nbList.Contains(c); }
    
    // Все, что связано с реализацией IEnumerator, перенаправляется в nbList 
    	public IEnumerator GetEnumerator()
    	{ return nbList.GetEnumerator(); }
    }
    

    Реализация класса NBook и код программы, использующей класс NBooks представлены ниже.

    using System;
    using System.Collections.Generic;
    using System.Collections;
    using System.Text;
    
    namespace NBooks
    {
      public class NBook
      {
    
    // Конструктор класса NBook
    
      public string Model;
      public string CPU_model;
      public int CPU_clock;
      public int RAM_size;
    
      public NBook(string mname, string CPU, int Clock, int RAM)
      {
        Model = mname;
        CPU_model = CPU; 
        CPU_clock = Clock; 
        RAM_size = RAM;
      }
    }
    
      class Program
      {
        static void Main(string[] args)
        {
          NBooks nbLot = new NBooks();
    
    // Создание списка объектов NBook 
    
    	nbLot.AddNBook( new NBook("ASUS A7Sn","Intel Core 2 Duo  T8300", 2400, 2048));
    	nbLot.AddNBook( new NBook("Acer Aspire 5530G-803G25Mi","AMD Turion X2 Ultra ZM80", 2100, 3072));
    	nbLot.AddNBook( new NBook("Fujitsu Amilo Si 2636", "Intel Core 2 Duo T8300", 2400, 2048));
    	nbLot.AddNBook( new NBook("HP Pavilion tx2650er", "AMD Turion X2 Ultra ZM82",  2200, 4096));
    
    // Выводим информацию о каждом объекте при помощи конструкции foreach 
    
    	Console.WriteLine("You have {0} in the lot: \n", nbLot.NBookCount);
    	foreach (NBook nb in nbLot)
    	{
    	  Console.WriteLine("Model: {0}", nb.Model);
      Console.Write("CPU: {0}", nb.CPU_model);
      Console.WriteLine(" {0} GHz", nb.CPU_clock);
      Console.WriteLine("RAM: {0} GB\n", nb.RAM_size);
    	}
    
    // Удаляем один из ноутбуков
    
    	nbLot.RemoveNBook(3);
    	Console.WriteLine("You have {0} in the lot.\n", nbLot.NBookCount);
    
    // Добавляем еще один ноутбук и проверяем его наличие в наборе 
    
    	NBook temp = new NBook("ASUS M51Ta", "AMD Turion™ X2 Ultra ZM84",  2300, 4096);
    	nbLot.AddNBook(temp);
    
    	if(nbLot.NBookIsPresent(temp))
    		Console.WriteLine(temp.Model + " is already in the lot.");
    
    // Удалить все
    
    	nbLot.ClearAllNBooks();
    	Console.WriteLine("You have {0} in the lot.\n", nbLot.NBookCount);
        }
      }
    }
    

    Результат выполнения программы:

    Задание 3. Создание и редактирование HTML документа в VWDE2008.

  • С помощью меню "File > New File" или комбинации клавиш <CTRL> + N создайте HTML страницу (выбрав соответствующий щаблон).
  • С левой стороны от окна с HTML кодом наведите курсор на панель инструментов "Toolbox", на которой представлены основные элементы HTML документов.
  • Выберите элемент Table и перетащите его в окно с HTML кодом. В результате в HTML коде странице автоматически добавятся теги, описывающие пустую таблицу. Причем в режиме отображения "split" (задается выбором закладки в нижней части окна с кодом HTML) внизу появится окно дизайна с видом пустой таблицы.
  • Используя контекстное меню (правая кнопка мыши) добавьте в окне дизайна к таблице новый столбец и 2 новых строки.
  • В первой строке таблице вручную измените теги <td> на <th> для того, чтобы сформировать "шапку" таблицы.
  • Заполните ячейки таблицы следующим содержимым:
  • Дисциплина Семестр Учебных часов
    1 Математический анализ 1 90
    2 Информатика 1 72
    3 Философия 3 72
    4 Информационные сети 6 64
  • Выделите в окне дизайна всю таблицу, затем в меню Format выберите раздел New Style:
  • Задайте в полях появившегося окна "New Style" следующие значения:
  • имя селектора: #subjects
  • категория "Font": font-family:" Times New Roman, Times, serif";
  • категория "Position": width:100%;
  • категория "Table": border-collapse:collapse;
  • Нажмите кнопку "OK" и затем аналогичным образом задайте для селектора "#subjects td, #subjects th" значения категорий:
  • font-size:1em;
  • border:1px solid #98bf21;
  • padding:3px 7px 2px 7px;
  • Для селектора "#subjects th" отдельно определите следующие значения:
  • font-size:1.1em;
  • text-align:left;
  • padding-top:5px;
  • padding-bottom:4px;
  • background-color:#A7C942;
  • color:#ffffff;
  • а для селектора "#subjects tr.alt td":

  • color:#000000;
  • background-color:#EAF2D3;
  • В итоге в окне HTML кода появится новая секция объявления списка стилей:

  • Выделите целиком таблицу и в окне "Properties" задайте для свойства Id значение subjects:

    Таким же образом для 2-й и 4-й строк таблицы задайте значение свойства class = "alt".

    В результате в HTML коде будут автоматически добавлены идентификаторы (классы) задающие стиль элементов таблицы.

  • В окне дизайна таблицы с помощью правой кнопки мыши выберите "View in Browser".
  • Сохраните файл с веб-страницей с именем "Table.html".
  • Контрольные задания

  • Разработка консольного приложения для вычисления корней квадратного уравнения.

    Требуется разработать приложение, которое по заданным значениям коэффициентов a,b и c квадратного уравнения (значения вводятся с клавиатуры пользователем) вычисляет и отображает на экране корни уравнения.

    Для данного приложения потребуются следующие методы:

  • string Console.ReadLine() - чтение строки символов из входного потока.
  • double Convert.ToDouble(string) - преобразование строки символов в число с плавающей запятой двойной точности.
  • double Math.Sqrt(double) - извлечение квадратного корня числа.
  • Для изучения приводимых в лабораторной работе примеров необходимо создать в Microsoft Visual Studio проект консольного приложения и описать класс Program, используя приводимый в примерах код.

  • Необходимо разработать консольное приложение для ввода с клавиатуры массива строк и поиска среди них строк, содержащих заданный строковый фрагмент. Для поиска потребуется использование метода IndexOf(string findThisString) для строковых элементов массива. Метод возвращает позицию начала искомой подстроки от начала строки, либо значение -1 при отсутствии соответствия.
  • Используя средства Visual Web Developer Express добавьте в таблице новый столбец "Преподаватель" и внесите в него данные.
  • Используя средства Visual Web Developer Express, вынесите таблицу стилей во внешний CSS файл. В HTML документе Table.html должна быть только ссылка на внешний файл. Проверьте, какие изменения произойдут при этом в режиме работы с панелью инструментов разработчика в IE9.
  • Страницы:

    Теоретический материал

    MicrosoftVisualStudio .NET - это интегрированная среда разработки для создания, документирования, запуска и отладки программ, написанных на языках .NET.

    Эта среда разработки является открытой языковой средой. Наряду с языками программирования, изначально включенными в среду - C++, C#, J#, Visual Basic, - в нее могут добавляться любые языки программирования, компиляторы которых создаются сторонними разработчиками. Необходимым условием для включения языков в среду VisualStudio .NET является использование единого каркаса - платформы Framework.Net.

    Платформа Framework.NET позволяет:

  • легко использовать компоненты, разработанных на различных языках;
  • разрабатывать единое приложение из нескольких частей на разных языках;
  • Для разработки приложений в Visual Studio.NET используются проекты.

    Проект (Project) - это основная единица, с которой имеет дело разработчик. Сначала он должен выбрать тип проекта, после чего Visual Studio создает каркас проекта в соответствии с выбранным типом.

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

    Несколько проектов могут объединяться в решение (Solution), которое также может включать ресурсы, необходимые этим проектам.

    С точки зрения разработчика конечным результатом его работы, получаемым после компиляции исходного программного кода, является решение, а с точки зрения CLR (Common Language Runtime - общеязыковой среды исполнения) - сборка (assembly), содержащая PE файл, т.е. модуль в формате исполняемого файла PE (Portable Executable) для 32-разрядной ОС Windows либо DLL (Dynamic Link Library) файл.

    Visual Studio.Net предлагает большое разнообразие возможных типов проектов. Для ознакомления с основами языка С# в основном будут использованы консольные приложения без привлечения привычных в Windows возможностей пользовательского интерфейса.

    В C# нет глобальных функций, поэтому по умолчанию при создании консольного приложения объявляется класс Program, который содержит функцию static Main(), служащую начальной точкой выполнения программы. Функция Main может быть объявлена без параметров или с параметром, представляющий собой массив строк.

    Также программа на C# может содержать комментарии и атрибуты.

    В C# используются однострочные и многострочные комментарии. Однострочный комментарий начинается с пары символов "//", и весь текст до конца строки является комментарием. Многострочный комментарий начинается с пары символов /* и заканчивается */.

    Атрибут - средство добавления декларативной информации к элементам программного кода. Назначение атрибутов: организация взаимодействия между программными модулями, дополнительная информация об условиях выполнения кода, управление сериализацией (т.е. правила сохранения информации), отладка, и др. Атрибуты могут быть как стандартными, так и заданными пользователем. Стандартные атрибуты используются CLR и влияют на то, как будет выполняться проект. Атрибут размещается в скобках "[]".

    1. Типы данных C#.

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

  • Логический тип (bool).
  • Символьный тип (char).
  • Целые типы. Они могут отличаться размером: short, int, long, а также могут быть знаковыми (signed) или беззнаковыми (unsigned).
  • Типы с плавающей точкой. Они также могут отличаться размерами: float, double и long double.
  • Тип void указывает на отсутствие информации.

    К конструируемым типам относятся следующие:

  • Указатели (например, char*).
  • Ссылки (например, char).
  • Массивы (например, char[]).

    Также язык позволяет разработчику конструировать собственные типы:

  • Перечислимые типы (enum).
  • Структуры (struct).
  • Классы.
  • В языке C# все типы можно рассматривать и под другим ракурсом, разделив их на четыре категории:

  • Типы-значения (value).
  • Ссылочные (reference).
  • Указатели (pointer).
  • Тип void.
  • Для ссылочного типа значение задает ссылку на область памяти в "куче" (heap), где расположен соответствующий объект. Для типа-значения значением являются собственно данные, а память для них выделяется в стеке.

    Логический, арифметический, структуры, перечисление относятся типам-значениям. Массивы, строки и классы относятся к ссылочным типам.

    И ссылочные, и обычные типы являются производными от базового класса object. В тех случаях, когда обычный тип должен вести себя как объект, создается оболочка (wrapper), которую можно рассматривать как ссылочный объект, помещенный в кучу, и в нее копируется значение переменной обычного типа. Оболочка автоматически помечается таким образом, что система знает, какое значение она содержит. Этот процесс назывется упаковкой (boxing), а обратный процесс - распаковкой (unboxing).

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

    7.ToString();
    

    целое число 7 упаковывается путем вызова функции Int32.ToString().

    Массивы в C# могут быть многомерными (multidimensional) или невыровненными (jagged). Более сложные структуры данных такие, как стек и хеш-таблица определены в пространстве имен System.Collections.

    2. Выражения и операторы C#.

    Выражения строятся из операндов - констант, переменных, функций, - объединенных знаками операций и скобками. При вычислении выражения определяется его значение и тип.

    В таблице ниже приведен список операций C#.

    Категория операций Операции
    Арифметические + - * / %
    Логические (boolean и побитовые) | ^ ! ~ ||
    Строковые +
    Инкремент и декремент ++ --
    Сдвиг >> <<
    Сравнение == != < > <= >=
    Присвоение = += -= *= /= %= = |= ^= <<= >>=
    Обращение к члену класса .
    Индексация []
    Приведение типа (Cast) ()
    Условие ?:
    Создание объекта new()
    Информация о типе is sizeof typeof
    Управление исключениями checked unchecked
    Косвенности и адресации * -> []

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

    По используемым выражениям и операторам C# похож на C++. Так в программах на C# используются такие операторы как:

  • Оператор присваивания (=)
  • Составной оператор ({})
  • Операторы выбора: if-else и switch
  • Операторы цикла: for, while, оператор
  • Операторы break и continue
  • Оператор return
  • Оператор перехода goto
  • Кроме того, введены несколько новых инструкций. Например, оператор foreach позволяет получить доступ ко всем элементам массива или коллекции поочередно, в порядке возрастания индексов. Его синтаксис:

    foreach (тип идентификатор in контейнер) оператор
    

    В C# процедуры и функции существуют только как методы некоторого класса, они не определены вне класса. Роль библиотек процедур и функций выполняют библиотеки классов. Библиотека классов Framework Class Library (FCL), доступная в языке C#, существенно расширяет возможности языка.

    3. Классы и методы в C#.

    В Visual Studio.Net, и в C# в частности, любая программная система рассматривается как совокупность классов, объединенных в проекты, пространства имен, решения.

    Описание класса имеет следующий синтаксис:

    [атрибуты][модификаторы]class имя_класса[:список_родителей] {тело_класса}
    

    В теле класса могут быть объявлены:

  • константы;
  • поля;
  • конструкторы и деструкторы;
  • методы;
  • события;
  • делегаты;
  • классы (структуры, интерфейсы, перечисления).
  • Поля класса синтаксически являются обычными переменными (объектами) языка. Их описание удовлетворяет обычным правилам объявления переменных. Поля характеризуют свойства объектов класса.

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

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

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

    [<спецификатор доступа>] delegate <тип результата> <имя класса> (<список аргументов>);
    

    4. Массивы

    Язык C# предоставляет средства для работы с одномерными массивами, массивами массивов и многомерными массивами.

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

    // Объявление массива размерности 3 из элементов типа int.
    // Фактически это массив составляющих, представляющих собой массивы 
    // размерности 2 одномерных массивов элементов типа int.
    // Размеры всех составляющих массивов одного уровня равны
    // между собой ("прямоугольный" массив).
    
    int[,,] ar1; 
    
    // Объявление одномерного массива из 
    // одномерных массивов элементов, каждый из которых является 
    // одномерным массивом элементов типа int.
    
    int[][][] ar2;
    
    // Объявление одномерного массива составляющих, каждый из которых является 
    // двумерным массивом массивов элементов типа int.
    // При этом у всех составляющих могут быть разные размеры
    
    int[][,] ar3;
    
    // Объявление двумерного массива составляющих, каждая из которых является 
    // одномерным массивом элементов типа int.
    // При этом у всех составляющих могут быть разные размеры.
    
    int[,][] ar4;
    

    Рассмотренные примеры демонстрируют определение двух различных категории массивов:

  • прямоугольные массивы,
  • ломаные (jagged) массивы.
  • Объявление массива может быть совмещено с инициализацией. При объявлении с отложенной инициализацией сам массив не формируется, а создается только ссылка на массив, имеющая неопределенное значение Null. Поэтому пока массив не будет реально создан и его элементы инициализированы, использовать его нельзя.

    Возможны два варианта объявления массива совмещенного с инициализацией.

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

    int[] odd = {1, 3, 5, 7, 9};
    

    Во втором случае создание и инициализация массива реализуется вместе с вызовом конструктора массива. Например:

    int[] even = new int[5];
    

    Все массивы являются потомками класса System.Array, который в свою очередь наследует ряд интерфейсов: ICloneable, IList, ICollection, IEnumerable, а, следовательно, реализует все их методы и свойства. Кроме того, класс Array имеет большое число собственных методов и свойств.

    Благодаря наследованию от класса System.Array, для массивов определены такие встроенные методы копирования, поиска, обращения, сортировки. Массивы можно рассматривать также как как коллекции и использовать цикл foreach для перебора его элементов.

    Ниже приведены основные свойства и методы класса System.Array:

    Свойство Описание
    IsFixedSize Возвращает true, если массив является статическим
    IsReadOnly Для всех массивов возвращает значение false
    IsSynchronized Возвращает true или false, в зависимости от того, установлена ли синхронизация доступа для массива
    Length Число элементов в массиве
    Rank Размерность массива
    Метод Описание
    BinarySearch Бинарный поиск элементов
    Clear Выполняет инициализацию элементов. Числовые элементы становятся нулевыми, а строковые принимают значение Null
    Clone Клонирование массива
    Copy Копирование части или всего массива в другой массив
    CopyTo Копируются все элементы одномерного массива в другой одномерный массив, начиная с заданного индекса
    CreateInstance Создание экземпляра массива
    GetEnumerator Возварщает интерфейс IEnumerator. Необходим для использования в цикле foreach
    GetLength Возвращает число элементов массива по указанному измерению
    GetLowerBound, GetUpperBound Возвращает нижнюю и верхнюю границу по указанному измерению. Для массивов нижняя граница всегда равна нулю.
    GetValue SetValue Возвращает или устанавливает значение элемента массива с указанными индексами.
    IndexOf Индекс первого вхождения образца в массив
    LastIndexOf Индекс последнего вхождения образца в массив
    Reverse Сортировка одномерного массива в обратном порядке
    Sort Сортировка массива

    5. Строки

    В языке C# определен класс сhar[], и его можно использовать для представления строк постоянной длины. Однако массив сhar[] - это обычный массив, поэтому его нельзя инициализировать строкой символов. В C# не определено преобразование из класса сhar[] в класс String. У String есть динамический метод ToCharArray, задающий подобное преобразование в сhar[].

    Объекты класса String объявляются с явной или отложенной инициализацией, с явным или неявным вызовом конструктора класса. Чаще всего, при объявлении строковой переменной конструктор явно не вызывается, а инициализация задается строковой константой. У класса String достаточно много конструкторов, которые позволяют сконструировать строку из:

  • символа, повторяющегося указанное число раз;
  • массива символов char[];
  • части массива символов.
  • Методы класса String позволяют выполнять вставку, удаление, замену, поиск вхождения подстроки в строку. Класс String наследует методы класса Object, а также методы четырех интерфейсов: IComparable, ICloneable, IConvertible, IEnumerable.

    Некоторые из членов класса приведены в таблице:

    Метод Описание
    Length Это свойство возвращает длину указанной строки
    Insert Вставляет подстроку в заданную позицию
    Remove Удаляет подстроку в заданной позиции
    Replace Заменяет подстроку в заданной позиции на новую подстроку
    Substring Выделяет подстроку в заданной позиции
    IndexOf, IndexOfAny, LastIndexOf, LastIndexOfAny Определяются индексы первого и последнего вхождения заданной подстроки или любого символа из заданного набора
    StartsWith, EndsWith Возвращается true или false, в зависимости от того, начинается или заканчивается строка заданной подстрокой
    PadLeft, PadRight Выполняет заполнение нужным числом пробелов в начале и в конце строки
    Trim, TrimStart, TrimEnd Удаляются пробелы в начале и в конце строки, либо только с одного конца
    ToCharArray Преобразование строки в массив символов

    Класс String не разрешает изменять существующие объекты. Для этой цели имеется другой класс - класс StringBuilder, который позволяет исправить данный недостаток. Этот класс принадлежит к изменяемым классам и его можно найти в пространстве имен System.Text.

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

  • Первая группа позволяет задать строку или подстроку, значением которой будет инициализироваться создаваемый объект класса StringBuilder.
  • Вторая группа параметров позволяет задать размер объекта, т.е объем памяти, отводимой для экземпляру класса StringBuilder.

    Примеры конструкторов:

  • public StringBuilder(string str, int size). Параметр str задает строку для инициализации, size - размер объекта;
  • public StringBuilder(int cursize, int maxsize). Параметры cursize и maxsize задают начальный и максимальный размер объекта;
  • public StringBuilder(string str, int start, int len, int size). Параметры str, start, len задают строку инициализации, size - размер объекта.
  • Над строками этого класса определены (также как идля строк класса String) операции:

  • присваивание (=);
  • две операции проверки эквивалентности (==) и (!=);
  • взятие индекса ([]).
  • Операция конкатенации (+) не определена над строками класса StringBuilder, ее роль играет метод Append, добавляющий новую строку в конец существующей.

    6. Интерфейсы

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

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

    Среди интерфейсов, встроенных в библиотеку базовых классов .NET, можно особо выделить такие как:

  • IEnumerable (для работы с наборами объектов, в т.ч. с использованием оператора foreach).
  • IClonable (копирование объектов).
  • IComparable (для сравнения и сортировки объектов).
  • Пространство имен System.Collections, предназначенное для работы с наборами объектов, поддерживает интерфейсы:

  • ICollection (определяет общие характеристики класса набора элементов).
  • IComparer, IDictionary (позволяет представлять содержимое объекта в виде пар имя-значение).
  • IDictionaryEnumerator (нумерация содержимого объекта, поддерживающего IDictionary).
  • IEnumerable, IEnumerator.
  • IHashCodeProvider (возвращает хэш-код с помощью выбранного алгоритма хэширования).
  • IList (обеспечивает методы добавления, удаления и индексирования элементов в списке объектов).
  • 7. Visual Web Developer Express

    Visual Web Developer Express - это полнофункциональная среда разработки, предназначенная для создания веб-приложений ASP.NET, называемых "веб-узлами".

    Visual Web Developer Express (VWDE) предоставляет в распоряжение веб-разработчика следующие функциональные возможности:

  • Конструирование веб-страниц. Мощный редактор веб-страниц, который имеет режим представления WYSIWYG и режим редактирования HTML с поддержкой технологии IntelliSense и возможностью проверки кода.
  • Функции конструирования страниц. Целостный макет узла с главными страницами и целостное отображение страниц с темами и обложками.
  • Редактирование кода. Редактор кода, который позволяет писать код для динамических веб-страниц на Visual Basic или C#. Редактор кода имеет функции синтаксической разметки и IntelliSense.
  • Отладка. Отладчик, помогающий находить ошибки в создаваемых программах.
  • Элементы управления. Расширенный набор серверных веб-элементов управления ASP.NET, включающих большую часть функциональности, необходимой для создания веб-узлов.
  • Доступ к данным. Поддержка отображения и редактирования данных на веб-страницах. Данные могут находиться в различных хранилищах, включая базы данных и XML-файлы. Во многих случаях можно добавлять данные, отображать их и редактировать прямо на веб-страницах без необходимости написания кода.
  • Безопасность, персонализация и прочее. Встроенные службы приложений, которые позволяют добавлять к веб-узлу функцию членства для обеспечения безопасности при входе, свойства профилей, которые позволяют хранить индивидуальную информацию пользователей, и другие функции, в большинстве из которых не требуется писать код.
  • Разработка для размещенных веб-узлов. Средства для публикации узлов на размещенном веб-узле, в том числе и на локальных веб-серверах для тестирования.
  • Visual Web Developer Express (VWDE) представляет собой удобную среду для построения веб-узлов и их публикации. Используя инструменты разработки VWDE, можно разрабатывать веб-узлы ASP.NET на собственном компьютере. В состав VWDE входит локальный веб-сервер, который обеспечивает все функции, необходимые для тестирования и отладки веб-узлов ASP.NET, и не требует установки сервера IIS.

    В VWDE можно произвести предварительную компиляцию и развернуть веб-узел при помощи команды "Построить веб-узел" (Build Web Site). Команда "Построить веб-узел" запускает компилятор для всего веб-узла, а не только для файлов кода, и создает макет веб-узла, который можно развертывать уже на рабочем сервере.

    Visual Web Developer Express предоставляет в распоряжение веб-разработчика целый набор шаблонов ASP.NET 2.0. По-сути - это готовые веб-узлы, которые можно использовать в качестве собственных веб-узлов с минимальными изменениями. Чтобы использовать шаблон, необходимо создать новый новый веб-узел и выбрать требуемый шаблон.

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

    Порядок выполнения лабораторной работы

    Для практического изучения примеров в данной лабораторной работе необходимо наличие установленного пакета Microsoft Visual Studio (версии не ранее 2003). В зависимости от установленной версии возможны несущественные отличия в интерфейсе среды при создании и работе с проектом консольного приложения.

    Задание 1. Создание проекта консольного приложения.

  • Первый шаг при разработке любого приложения - создание проекта. Для этого через разделы меню: File > New > Project запускается панель создания нового проекта следующего вида:
  • Из списка предлагаемых шаблонов необходимо выбрать проект консольного приложения (Console Application).
  • После создания проекта должно появиться следующее окно, содержащее текст программы Program.cs на языке C#:

    В данной программе объявление using System дает возможность ссылаться на классы, которые находятся в пространстве имен System, так что их можно использовать, не добавляя "System." перед именем типа.

    Пространство имен System содержит много полезных классов. Одним из них является и класс Console, который используется при создании консольных приложений.

    Класс проекта - Program размещен в пространстве имен, имеющем по умолчанию то же самое имя (HelloWorldDemo), что и решение, содержащее в данном примере единственный проект.

    Поскольку в C# нет глобальных функций, поэтому в данном примере объявляется класс Program, который содержит функцию static Main(), служащую начальной точкой выполнения программы. Функция Main может быть объявлена без параметров или с параметром, представляющий собой массив строк. Так как функция Main является точкой входа, она должна быть статической (static) функцией, т.е. она не связана с конкретным объектом класса, в котором объявлена.

  • Добавим внутри функции Main следующую строку:
    Console.WriteLine("Hello world!");
    

    которая использует метод WriteLine класса Console для вывода строки "Hello world!".

  • Компиляция проекта. Для можно использовать либо меню (Build > Build Имя проекта) или сочетание клавиш <Shift+F6>. При наличии сообщений об ошибках необходимо их исправить и скомпилировать проект снова.
  • Запуск приложения. Для можно использовать либо меню (Debug > Start Without Debugging) или сочетание клавиш <Ctrl+F5>. В результате получим следующее консольное окно:
  • Усложним приложение. Для этого добавим в функцию Main следующий код для вывода в консольное окно содержимого массива целых чисел:
    static void Main(string[] args)
    {
    int[] ArInt = { 0, 9, 1, 8, 2, 7, 3, 6, 4, 5 };
    
    Console.WriteLine("Array contains elements:");
    foreach (int item in ArInt)
    {
    Console.Write("{0} ", item);
    }
    Console.WriteLine("");
    }
    

    После повторения шагов 3-4 получим следующее окно:

  • Задание 2. Работа с массивами.

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

  • Прямоугольный массив.
    
    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace HelloWorldDemo
    {
    class Program
    {
    static void Main(string[] args)
    {
    // Прямоугольный многомерный массив
    int[,]multMatr;
    multMatr = new int[10,10];
    
    // Заполнение массива 9 на 9:
    for (int i = 1; i <= 9; i++)
    for (int j = 1; j < 9; j++)
    multMatr[i, j] = i * j;
    
    // Вывод элементов многомерного массива 
    for (int i = 1; i <= 9; i++)
    {
    for (int j = 1; j <= 9; j++)
    {
    Console.Write(multMatr [i, j] + "\t");
    }
    Console.WriteLine();
    }
    }
    }
    

    В результат выполнения программы получим таблицу умножения следующего вида:

  • Ломаный массив.
    
    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace HelloWorldDemo
    {
    class Program
    {
       static void Main(string[] args)
       {
    // Ломаный многомерный массив из пяти внутренних массивов разного размера 
    int[][] JagArr = new int[10][];
    
    // Инициализация генератора случайных чисел
    Random rand = new Random();
    
    // Динамическое создание ломаного массив
    for (int i = 0; i < JagArr.Length; i++)
    {
    JagArr[i] = new int[i + rand.Next(10)];
    }
    
    // Вывод строк на консоль 
    // Каждый элемент по умолчанию имеет значение, равное  
    for (int i = 0; i < 10; i++)
    {
    // Свойство Length массива возвращает его размер
    Console.Write("Length of row {0} is {1}:\t", i, JagArr[i].Length);
    for (int j = 0; j < JagArr[i].Length; j++)
    {
    Console.Write(JagArr[i][j] + " ");
    }
    Console.WriteLine();
    }
       }
    }
    
    }
    

    В результате выполнения программы получим следующую таблицу:

  • Свойства и методы класса Array.

    Следующий пример демонстрирует использование некоторых из свойств и методов класса Array:

    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace HelloWorldDemo
    {
        class Program
        {
            static void Main(string[] args)
            {
         // Массив символьных строк
                string[] Brands = new string[]
    				{"Audi",
                    "BMW",
                    "Buick",
                    "Chevrolet",
                    "Citroen",
                    "Dodge",
                    "Ferrari",
                    "Fiat",
                    "Ford",
                    "Honda",
                    "Hyundai",
                    "Cherokee",
                    "Cherry",
                    "Lada",
                    "Lamborghini",
                    "Lincoln",
                    "Mazda",
                    "Mercedes",
                    "Mitsubishi",
                    "Nissan",
                    "Opel",
                    "Peugeot",
                    "Plymoth",
                    "Pontiac",
                    "Renault",
                    "Rover",
                    "Saab",
                    "Subaru",
                    "Suzuki",
                    "Toyota",
                    "Volkswagen",
                    "Volvo"};
    
    	// Вывод марок автомобилей в соответствии с порядком элементов в массиве
     
    			Console.WriteLine("Here is the array of car brands:");
    
    			for (int i = 0; i < Brands.Length; i++)
    				Console.Write(Brands[i] + "\t");
    
                Console.Write("\n\n");
    
    	// Сортировка элементов в обратном порядке 
    	
    			Array.Reverse(Brands);
    
    	// Вывод автомарок 
    			Console.WriteLine("Here is the list once reversed:");
    			for (int i = 0; i < Brands.Length; i++)
    				Console.Write(Brands[i] + "\t");
    
                Console.Write("\n\n");
    
    	// Остаются только первый и последний
    
    			Console.WriteLine("Only two remain: ");
    			Array.Clear(Brands, 2, Brands.Length-2);
    
    			for (int i = 0; i < Brands.Length; i++)
    			{
    				Console.Write(Brands[i] + "\t\n");
    			}
    		}
        
        }
    }
    

    Результат работы программы:

    Использование класса StringBuilder

    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace HelloWorldDemo
    {
    class Program
    {
    static void Main(string[] args)
    {
    StringBuilder WordList = new StringBuilder("Каждый Охотник ");
    
    WordList.Append("Желает Знать Где ");
    Console.WriteLine(WordList);
    
    WordList.Append("Сидит Фазан");
    Console.WriteLine(WordList);
    
    // Сделать все буквы прописными
    string Spectrum = WordList.ToString().ToUpper();
    Console.WriteLine(Spectrum);
    }
    }
    }
    

    Результат работы программы:

    Использование класса ArrayList

    Использование класса ArrayList из пространства имен System.Collections позволяет эффективно реализовать работу с массивами объектов, поскольку многие возможности, необходимые для этого реализованы изначально, в частности методы вставки, удаления и нумерации элементов.

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

    public class NBooks : IEnumerable
    {
    // nbList - внутренний класс, который будет делать всю работу 
    	private ArrayList nbList;
    
    // Создаем объект класса nbList при помощи конструктора NBooks 
    	public NBooks() {nbList = new ArrayList();}
    
    // Реализуем нужные нам методы для приема вызовов извне и передачи их nbList 
    		
    	// Метод для вставки объекта NBook
    	public void AddNBook(NBook nb)
    	{ nbList.Add(nb); }
    
    // Метод для удаления объекта NBook
    	public void RemoveNBook(int nbToRemove)
    	{ nbList.RemoveAt(nbToRemove); }
    
    // Свойство, возвращающее количество объектов NBook
    	public int NBookCount
    	{ get { return nbList.Count; } }
    
    // Метод для очистки объекта - удаления всех объектов NBook 
    	public void ClearAllNBooks()
    	{ nbList.Clear(); }
    
    // Метод, который отвечает на вопрос - есть ли уже в наборе такой объект NBook 
    	public bool NBookIsPresent(NBook c)
    	{ return nbList.Contains(c); }
    
    // Все, что связано с реализацией IEnumerator, перенаправляется в nbList 
    	public IEnumerator GetEnumerator()
    	{ return nbList.GetEnumerator(); }
    }
    

    Реализация класса NBook и код программы, использующей класс NBooks представлены ниже.

    using System;
    using System.Collections.Generic;
    using System.Collections;
    using System.Text;
    
    namespace NBooks
    {
      public class NBook
      {
    
    // Конструктор класса NBook
    
      public string Model;
      public string CPU_model;
      public int CPU_clock;
      public int RAM_size;
    
      public NBook(string mname, string CPU, int Clock, int RAM)
      {
        Model = mname;
        CPU_model = CPU; 
        CPU_clock = Clock; 
        RAM_size = RAM;
      }
    }
    
      class Program
      {
        static void Main(string[] args)
        {
          NBooks nbLot = new NBooks();
    
    // Создание списка объектов NBook 
    
    	nbLot.AddNBook( new NBook("ASUS A7Sn","Intel Core 2 Duo  T8300", 2400, 2048));
    	nbLot.AddNBook( new NBook("Acer Aspire 5530G-803G25Mi","AMD Turion X2 Ultra ZM80", 2100, 3072));
    	nbLot.AddNBook( new NBook("Fujitsu Amilo Si 2636", "Intel Core 2 Duo T8300", 2400, 2048));
    	nbLot.AddNBook( new NBook("HP Pavilion tx2650er", "AMD Turion X2 Ultra ZM82",  2200, 4096));
    
    // Выводим информацию о каждом объекте при помощи конструкции foreach 
    
    	Console.WriteLine("You have {0} in the lot: \n", nbLot.NBookCount);
    	foreach (NBook nb in nbLot)
    	{
    	  Console.WriteLine("Model: {0}", nb.Model);
      Console.Write("CPU: {0}", nb.CPU_model);
      Console.WriteLine(" {0} GHz", nb.CPU_clock);
      Console.WriteLine("RAM: {0} GB\n", nb.RAM_size);
    	}
    
    // Удаляем один из ноутбуков
    
    	nbLot.RemoveNBook(3);
    	Console.WriteLine("You have {0} in the lot.\n", nbLot.NBookCount);
    
    // Добавляем еще один ноутбук и проверяем его наличие в наборе 
    
    	NBook temp = new NBook("ASUS M51Ta", "AMD Turion™ X2 Ultra ZM84",  2300, 4096);
    	nbLot.AddNBook(temp);
    
    	if(nbLot.NBookIsPresent(temp))
    		Console.WriteLine(temp.Model + " is already in the lot.");
    
    // Удалить все
    
    	nbLot.ClearAllNBooks();
    	Console.WriteLine("You have {0} in the lot.\n", nbLot.NBookCount);
        }
      }
    }
    

    Результат выполнения программы:

    Задание 3. Создание и редактирование HTML документа в VWDE2008.

  • С помощью меню "File > New File" или комбинации клавиш <CTRL> + N создайте HTML страницу (выбрав соответствующий щаблон).
  • С левой стороны от окна с HTML кодом наведите курсор на панель инструментов "Toolbox", на которой представлены основные элементы HTML документов.
  • Выберите элемент Table и перетащите его в окно с HTML кодом. В результате в HTML коде странице автоматически добавятся теги, описывающие пустую таблицу. Причем в режиме отображения "split" (задается выбором закладки в нижней части окна с кодом HTML) внизу появится окно дизайна с видом пустой таблицы.
  • Используя контекстное меню (правая кнопка мыши) добавьте в окне дизайна к таблице новый столбец и 2 новых строки.
  • В первой строке таблице вручную измените теги <td> на <th> для того, чтобы сформировать "шапку" таблицы.
  • Заполните ячейки таблицы следующим содержимым:
  • Дисциплина Семестр Учебных часов
    1 Математический анализ 1 90
    2 Информатика 1 72
    3 Философия 3 72
    4 Информационные сети 6 64
  • Выделите в окне дизайна всю таблицу, затем в меню Format выберите раздел New Style:
  • Задайте в полях появившегося окна "New Style" следующие значения:
  • имя селектора: #subjects
  • категория "Font": font-family:" Times New Roman, Times, serif";
  • категория "Position": width:100%;
  • категория "Table": border-collapse:collapse;
  • Нажмите кнопку "OK" и затем аналогичным образом задайте для селектора "#subjects td, #subjects th" значения категорий:
  • font-size:1em;
  • border:1px solid #98bf21;
  • padding:3px 7px 2px 7px;
  • Для селектора "#subjects th" отдельно определите следующие значения:
  • font-size:1.1em;
  • text-align:left;
  • padding-top:5px;
  • padding-bottom:4px;
  • background-color:#A7C942;
  • color:#ffffff;
  • а для селектора "#subjects tr.alt td":

  • color:#000000;
  • background-color:#EAF2D3;
  • В итоге в окне HTML кода появится новая секция объявления списка стилей:

  • Выделите целиком таблицу и в окне "Properties" задайте для свойства Id значение subjects:

    Таким же образом для 2-й и 4-й строк таблицы задайте значение свойства class = "alt".

    В результате в HTML коде будут автоматически добавлены идентификаторы (классы) задающие стиль элементов таблицы.

  • В окне дизайна таблицы с помощью правой кнопки мыши выберите "View in Browser".
  • Сохраните файл с веб-страницей с именем "Table.html".
  • Контрольные задания

  • Разработка консольного приложения для вычисления корней квадратного уравнения.

    Требуется разработать приложение, которое по заданным значениям коэффициентов a,b и c квадратного уравнения (значения вводятся с клавиатуры пользователем) вычисляет и отображает на экране корни уравнения.

    Для данного приложения потребуются следующие методы:

  • string Console.ReadLine() - чтение строки символов из входного потока.
  • double Convert.ToDouble(string) - преобразование строки символов в число с плавающей запятой двойной точности.
  • double Math.Sqrt(double) - извлечение квадратного корня числа.
  • Для изучения приводимых в лабораторной работе примеров необходимо создать в Microsoft Visual Studio проект консольного приложения и описать класс Program, используя приводимый в примерах код.

  • Необходимо разработать консольное приложение для ввода с клавиатуры массива строк и поиска среди них строк, содержащих заданный строковый фрагмент. Для поиска потребуется использование метода IndexOf(string findThisString) для строковых элементов массива. Метод возвращает позицию начала искомой подстроки от начала строки, либо значение -1 при отсутствии соответствия.
  • Используя средства Visual Web Developer Express добавьте в таблице новый столбец "Преподаватель" и внесите в него данные.
  • Используя средства Visual Web Developer Express, вынесите таблицу стилей во внешний CSS файл. В HTML документе Table.html должна быть только ссылка на внешний файл. Проверьте, какие изменения произойдут при этом в режиме работы с панелью инструментов разработчика в IE9.
  • Вернуться к учебному плану