Программирование на языке высокого уровня C#

Начальные сведения

Показывать лекцию целиком

Предисловие

Этот курс лекций построен на основе учебника автора "C#. Программирование на языке высокого уровня", который выпускается издательством ПИТЕР с 2007 года. Учебник имеет гриф Министерства образования Российской федерации и удостоен в 2010 году премии Правительства Санкт-Петербурга "За выдающиеся достижения в сфере высшего и профессионального образования" в составе учебно-методического комплекса по языкам программирования.

В этот комплекс входят также учебники и практикумы по языкам C/C++ и Паскаль, построенные по единому принципу. Соответствующие учебные курсы можно найти на этом сайте. В комплекс входит более 250 индивидуальных вариантов заданий на лабораторные работы в расчете на учебную группу из 20 человек (все варианты можно найти в учебнике [4]) и более 1000 тестовых вопросов. Преподавателям будут полезны презентации лекций. На сайте интернет-школы программирования http://ips.ifmo.ru можно проверить правильность выполнения некоторых лабораторных работ с помощью системы автоматического тестирования программ.

Доброжелательную и конструктивную критику, а также предложения по улучшению курса направляйте автору по адресу pta-ipm@yandex.ru.

Знакомство с платформой .NET и средой Visual Studio .NET

Презентацию к данной лекции Вы можете скачать здесь.

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

  • текстовый редактор, предназначенный для ввода и корректировки текста программы;
  • компилятор, с помощью которого программа переводится с языка, на котором она написана, в машинные коды;
  • средства отладки и запуска программ ;
  • общие библиотеки, содержащие многократно используемые элементы программ;
  • справочную систему и другие элементы.
  • Под платформой понимается нечто большее, чем среда разработки для одного языка. Платформа .NET (произносится "дотнет") включает не только среду разработки для нескольких языков программирования, называемую Visual Studio.NET, но и множество других средств, например, механизмы поддержки баз данных, электронной почты и коммерции.

    Среда разработки Visual Studio.NET предоставляет мощные и удобные средства написания, корректировки, компиляции, отладки и запуска приложений, использующих .NET-совместимые языки. Корпорация Microsoft включила в платформу средства разработки для четырех языков: C#, VB.NET, C++ и J#.

    Платформа .NET является открытой средой. Это значит, что компиляторы для нее могут поставляться и сторонними разработчиками. Для обеспечения переносимости компиляторы, входящие в состав платформы, переводят программу не в машинные коды, а в промежуточный язык (Common Intermediate Language, CIL, или просто IL), который не содержит команд, зависящих от языка, операционной системы и типа компьютера. Программа на этом языке выполняется не самостоятельно, а под управлением системы, которая называется общеязыковой средой выполнения (Common Language Runtime, CLR).

    Среда CLR может быть реализована для любой операционной системы. При выполнении программы CLR вызывает так называемый JIT-компилятор, переводящий код с языка IL в машинные команды конкретного процессора, которые немедленно выполняются. JIT означает "just in time", что можно перевести как "вовремя", то есть компилируются только те части программы, которые требуется выполнить в данный момент. Каждая часть программы компилируется один раз и сохраняется в кэшеКэш— область оперативной памяти, предназначенная для временного хранения информации. для дальнейшего использования.

    Компилятор в качестве результата своего выполнения создает так называемую сборку  — файл с расширением exe или dll, который содержит код на языке IL и метаданные. Метаданные представляют собой сведения об объектах, используемых в программе, а также сведения о самой сборке. Они позволяют организовать межъязыковое взаимодействие, обеспечивают безопасность и облегчают развертывание приложений, то есть установку программ на компьютеры пользователей.

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

    Платформа .NET содержит огромную библиотеку классов, которые можно использовать при программировании на любом языке .NET. Подробное изучение библиотеки классов .NET — необходимая, но и наиболее трудоемкая задача программиста при освоении этой платформы. Библиотека классов вместе с CLR образуют каркас (framework), то есть основу платформы.

    Все .NET-совместимые языки должны отвечать требованиям общеязыковой спецификации (Common Language Specification, CLS), в которой описывается набор общих для всех языков характеристик. Это позволяет использовать для разработки приложения несколько языков программирования и вести полноценную межъязыковую отладку. Все программы независимо от языка используют одни и те же базовые классы библиотеки .NET.

    Приложение в процессе разработки называется проектом. Проект объединяет все необходимое для создания приложения: файлы, папки, ссылки и прочие ресурсы. Среда Visual Studio.NET позволяет создавать проекты различных типов, например:

  • Windows-приложение использует элементы интерфейса Windows, включая формы, кнопки, флажки и прочее;
  • консольное приложение выполняет вывод "на консоль", то есть в окно командного процессора;
  • библиотека классов объединяет классы, которые предназначены для использования в других приложениях;
  • веб-приложение  — это приложение, доступ к которому выполняется через браузер (например, Internet Explorer) и которое по запросу формирует веб-страницу и отправляет ее клиенту по сети;
  • Несколько проектов можно объединить в решение (solution). Это облегчает совместную разработку проектов

    Платформа .NET рассчитана на объектно-ориентированную технологию создания программ, поэтому прежде чем начинать изучение языка C#, необходимо познакомиться с основными понятиями объектно-ориентированного программирования (ООП).

    Введение в объектно-ориентированное программирование

    Принципы ООП проще всего понять на примере программ моделирования. В реальном мире каждый предмет или процесс обладает набором статических и динамических характеристик, иными словами, свойствами и поведением. Поведение объекта зависит от его состояния и внешних воздействий. Например, объект "автомобиль" никуда не поедет, если в баке нет бензина, а если повернуть руль, изменится положение колес.

    Понятие объекта в программе совпадает с обыденным смыслом этого слова: объект представляется как совокупность данных, характеризующих его состояние, и функций их обработки, моделирующих его поведение. Вызов функции на выполнение часто называют посылкой сообщения объекту. Например, вызов функции "повернуть руль" интерпретируется как посылка сообщения "автомобиль, поверни руль!".

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

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

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

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

    Таким образом, объект является "черным ящиком", замкнутым по отношению к внешнему миру. Это позволяет представить программу в укрупненном виде — на уровне объектов и их взаимосвязей, а следовательно, управлять большим объемом информации и успешно отлаживать сложные программы.

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

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

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

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

    Наследование является мощнейшим инструментом ООП и применяется для следующих взаимосвязанных целей:

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

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

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

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

    Подводя итог сказанному, сформулирую достоинства ООП:

  • использование при программировании понятий, близких к предметной области;
  • возможность успешно управлять большими объемами исходного кода благодаря инкапсуляции, то есть скрытию деталей реализации объектов и упрощению структуры программы;
  • возможность многократного использования кода за счет наследования;
  • сравнительно простая возможность модификации программ;
  • возможность создания и использования библиотек объектов.
  • Эти преимущества особенно явно проявляются при разработке программ большого объема и классов программ. Однако ничто не дается даром: создание объектно-ориентированной программы представляет собой весьма непростую задачу. Чтобы эффективно использовать готовые объекты из библиотек, необходимо освоить большой объем достаточно сложной информации. Неграмотное же применение ООП способно привести к созданию излишне сложных программ, которые невозможно отлаживать и усовершенствовать.

    Понятие класса

    Для представления объектов в языках C#, Java, С++, Delphi и т. п. используется понятие класс, аналогичное обыденному смыслу этого слова в контексте "класс членистоногих", "класс млекопитающих", "класс задач" и т. п. Класс является обобщенным понятием, определяющим характеристики и поведение некоторого множества конкретных объектов этого класса, называемых экземплярами класса.

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

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

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

    Обычно в одно пространство имен объединяют взаимосвязанные классы. Например,пространство System.Net содержит классы, относящиеся к передаче данных по сети, System.Windows.Forms  — элементы графического интерфейса пользователя, такие как формы, кнопки и т. д. Имя каждого пространства имен представляет собой неделимую сущность, однозначно его определяющую.

    Последнее, о чем необходимо поговорить, прежде чем начать последовательное изучение языка C#, — как создать простейшее приложение в среде Visual Studio.NET. Для того чтобы изучать именно язык программирования, а не сопутствующую информацию, мы будем работать с консольными приложениями. При запуске консольного приложения операционная система создает так называемое консольное окно, через которое идет весь ввод-вывод программы. Внешне это напоминает работу в операционной системе в режиме командной строки, когда ввод-вывод представляет собой поток символов.

    Простейшие приемы работы в среде

    Для создания проекта следует после запуска Visual Studio.NET в главном меню выбрать команду .

    (рис 1.1) Примерный вид экрана после создания проекта консольного приложения

    В верхней части экрана располагается главное меню (с разделами File, Edit, View и т. д.) и панели инструментов (toolbars). В верхней левой части экрана располагается окно управления проектом Solution Explorer (если оно не отображается, следует воспользоваться командой View $$\to$$ Solution Explorer главного меню). В окне перечислены все ресурсы, входящие в проект.

    В этом же окне можно увидеть и другую информацию, если перейти на вкладку Class View, ярлычок которой находится в нижней части окна. На вкладке Class View представлен список всех классов, входящих в приложение, их элементов и предков.

    В нижней левой части экрана расположено окно свойств Properties (если окна не видно, воспользуйтесь командой View $$\to$$ Properties главного меню). В окне свойств отображаются важнейшие характеристики выделенного элемента. Например, чтобы изменить имя файла, в котором хранится класс Class1, надо выделить этот файл в окне управления проектом и задать в окне свойств новое значение свойства FileName (ввод заканчивается нажатием клавиши Enter ).

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

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

    Заготовка консольной программы

    Рассмотрим каждую строку заготовки программы (листинг 1.1). В зависимости от версии оболочки вид заготовки может немного варьироваться.

    using System;
    
    namespace ConsoleApplication1
    {
        /// <summary>
        /// Summary description for Class1.
        /// </summary>
        class Class1
        {
            /// <summary>
            /// The main entry point for the application.
            /// </summary>
            [STAThread]
            static void Main(string[] args)
            {
                //
                // TODO: Add code to start application here
                //
            }
        }
    }

    Директива using System разрешает использовать имена стандартных классов из пространства имен System непосредственно (без указания имени пространства).

    Ключевое слово namespace создает для проекта собственное пространство имен, названное по умолчанию ConsoleApplication1. Это сделано для того, чтобы можно было давать программным объектам имена, не заботясь о том, что они могут совпасть с именами в других пространствах имен.

    C# — объектно-ориентированный язык, поэтому написанная на нем программа представляет собой совокупность взаимодействующих между собой классов. В нашей заготовке программы всего один класс, которому по умолчанию задано имя Class1. Описание класса начинается с ключевого слова class, за которым следуют его имя и далее в фигурных скобках — список элементов класса (его данных и функций, называемых также методами).

    Внимание

    Фигурные скобки являются важным элементом синтаксиса. Каждой открывающей скобке соответствует своя закрывающая, которая обычно располагается ниже по тексту с тем же отступом. Эти скобки ограничивают блок, внутри которого могут располагаться другие блоки, вложенные в него, как матрешки. Блок может применяться в любом месте, где допускается отдельный оператор.

    В данном случае внутри класса только один элемент — метод Main. Каждое приложение должно содержать метод Main  — с него начинается выполнение программы. Все методы описываются по единым правилам.

    Упрощенный синтаксис метода:

    [ спецификаторы ] тип имя_метода ( [ параметры ] )
    {
        тело метода: действия, выполняемые методом
    }

    Таким образом, любой метод должен иметь тип, имя и тело, остальные части описания являются необязательными. Среда заботливо поместила внутрь метода Main комментарий:

    // TODO: Add code to start application here

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

    Запуск консольного приложения лучше всего выполнять с помощью клавиш Ctrl + F5 (или командой меню Debug $$\to$$ Start Without Debugging ). Компилятор может обнаружить в тексте программы синтаксические ошибки. Он сообщает об этом в окне, расположенном в нижней части экрана.

    Теперь, когда вы получили общее представление о платформе .NET и основных понятиях ООП, можно приступить к планомерному изучению языка C#.

    Вопросы и задания для самостоятельной работы студента

  • Опишите достоинства и недостатки ООП.
  • Изучите состав меню среды разработки.
  • Изучите принципы организации справочной системы.
  • Найдите в справочной системе сведения о том, как создать консольное приложение.
  • Создайте на основе справочной системы консольное приложение, выводящее "Hello, world!", запустите его, изучите структуру и состав каталогов, созданных средой для хранения файлов приложения.
  • Вернуться к учебному плану