Опубликован: 19.08.2004 | Уровень: для всех | Доступ: платный | ВУЗ: Национальный исследовательский ядерный университет «МИФИ»

Лекция 4: Основные понятия языка программирования C#

Аннотация: В лекции обсуждаются вопросы, относящиеся к понятийному аппарату, истории развития, выразительным возможностям синтаксиса и особенностям реализации языка C# в сравнении с другими объектно-ориентированными языками программирования.
Ключевые слова: C, императивный язык, MIT, Unix, PL/I, IBM, BELLE, telephone, тип, структура, bell labs, класс, объект данных, корпорация, Си, высказывание, объект, компонентная архитектура, механизмы, безопасность кода, язык программирования, Java, Visual Basic, COM, Java Beans, SUN, компонент, интерфейс, обработка исключительных ситуаций, сборка мусора, пространство имен, сильная типизация, динамическая загрузка кода, перегруженный оператор, операции, синтаксис, целый, индексатор, reflection, компонентно-ориентированный подход, свойство, инкапсуляция данных, обработка событий, обработка исключений, система типизации, делегат, указатель, unboxing, преобразование типов, атрибут, прямоугольный массив, программа, файл, boxing, net, ссылочный тип, типы-значения, SL, тип-значение, стек, куча, переменная, значение, ссылка, тип-ссылка, Common Type System, CTS, SML, комбинаторная логика, константа, оператор перечисления, инициализация, список, область видимости, полное имя, дескриптор типа, определение системы, блок, компиляция, unsafe, координаты, метод, идентификатор, формализм, область описания, перечисление, событие, исключение, объектно-ориентированный подход, функция, операторы, цикла, figures, квалификационное имя, поддержка, объединение, язык программирования java, компилятор, среда разработки, код программы, производительность

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

История основной ветви языков программирования, которая привела к появлению C#, восходит к 60-м годам, а именно, ко времени возникновения языка B. Последний является типичным представителем ранних императивных языков программирования. Язык B был придуман в 1963 году творческим коллективом разработчиков, основным создателем языка принято считать К. Томпсона из Технологического института Массачусетса (Ken Thompson, MIT). Основной целью разработки языка была реализация операционной системы UNIX. Уже существовавший язык PL/I, применявшийся в то время для мэйнфреймов производства компании IBM, был достаточно громоздким и меньше подходил для поставленной задачи, чем новое, оригинальное решение ученых-практиков.

Следующим шагом в "алфавите" языков программирования, ведущем к языку C#, стал язык C, который был изобретен на основе языка B в 1972 году. Авторами нового языка программирования стали К.Томпсон и Д.Ритчи (Dennis Ritchie), которые работали в исследовательской лаборатории компании AT&T (AT&T Bell Telephone Laboratories). В варианте C язык B расширился за счет явного использования типов, структур и ряда новых операций. Дальнейшее развитие языка происходило в той же организации. И снова примерно через 10 лет, в 1984 году, Б. Страуструп (Bjarne Stroustrup, Bell Labs) выступил с проектом языка С++ – ООП-расширения языка C, в котором вводится понятие класса как объекта данных.

Заметим, что название C++ для нового языка предложил Р.Маскитти (Rics Mascitti, Bell Labs).

Наконец, уже в 2000 году, то есть более чем через 15 лет, корпорация Microsoft выпустила в свет C++ нового поколения под названием C# ("Си шарп"), основным постулатом которого является высказывание: "всякая сущность есть объект". Язык основан на строгой компонентной архитектуре и реализует передовые механизмы обеспечения безопасности кода.

Как уже отмечалось в ходе лекции, язык программирования C# объединил лучшие черты целого ряда предшественников. Кроме упомянутой ранее ветви языков B-C-C++, необходимо указать еще несколько знаковых для настоящего времени языков программирования, а именно, Java и Visual Basic.

Несмотря на весьма существенные различия между компонентной объектной моделью COM (основного стандарта Microsoft для компонентного проектирования и реализации программного обеспечения) и моделью Java Beans, базовым стандартом Sun Microsystems для компонент (зависимой от языка реализации), язык программирования C# имеет довольно много общего с языком Java. Естественно, немало черт язык программирования C# унаследовал и от своего предшественника, созданного корпорацией Microsoft, языка Visual Basic.

Как уже отмечалось, язык программирования C# основан на строгой компонентной архитектуре и реализует передовые механизмы обеспечения безопасности кода.

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

От своего прямого предшественника, языка программирования C++, языком C# унаследованы следующие механизмы: "перегруженные" операторы, небезопасные арифметические операции с плавающей точкой, а также ряд других особенностей синтаксиса. Но несмотря на то, что целый ряд конструктивных синтаксических механизмов и особенностей реализации унаследован языком программирования C# от прародителей (C++, Visual Basic и Java), возможности этого нового языка программирования не ограничиваются суммой возможностей его исторических предшественников.

Таблица 15.1. Основные возможности C#
Подобен языкам Java, C++ и VB, однако является компонентно-ориентированным и более безопасным
Добавлен ряд новых черт (делегаты, индексаторы, механизм (un)boxing и др.)

Сходство с Java

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

Сходство с С++

  • "перегруженные операторы"
  • арифметические операции с плавающей точкой относятся к небезопасному коду
  • некоторые особенности синтаксиса

 

 

 

К числу принципиально важных решений, которые реализованы корпорацией Microsoft в языке программирования C#, можно отнести следующие:

  • компонентно-ориентированный подход к программированию (который характерен и для идеологии Microsoft .NET в целом);
  • свойства как средство инкапсуляции данных (характерно также в целом для ООП);
  • обработка событий (имеются расширения, в том числе в части обработки исключений, в частности, оператор try );
  • унифицированная система типизации (соответствует идеологии Microsoft .NET в целом);
  • делегаты ( delegate – развитие указателя на функцию в языках C и C++);
  • индексаторы ( indexer – операторы индекса для обращения к элементам класса-контейнера);
  • перегруженные операторы (развитие ООП);
  • оператор foreach (обработка всех элементов классов-коллекций, аналог Visual Basic);
  • механизмы boxing и unboxing для преобразования типов ;
  • атрибуты (средство оперирования метаданными в COM-модели);
  • прямоугольные массивы (набор элементов с доступом по номеру индекса и одинаковым количеством столбцов и строк).
Структура программы на языке C#.

Рис. 15.1. Структура программы на языке C#.

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

Прежде всего, рассмотрим обобщенную структуру программы на языке программирования C#. Представим структуру программы на примере (см. рис.15.1).

Заметим, что программа на C# может состоять как из одного, так и из нескольких файлов, содержащих исходный текст на языке программирования C#. Каждый такой файл имеет расширение .CS (в нашем примере файлы названы FileName1.cs, FileName2.cs и FileName3.cs ).

Любой файл с исходным текстом на языке программирования C# может как содержать пространства имен, так и не содержать их (в нашем примере файл FileName2.cs включает три пространства имен, A, B и C, а FileName1.cs и FileName3.cs не содержат пространств имен ).

Наконец, каждое пространство имен может как содержать описание классов (одного или нескольких), так и не содержать (в нашем примере пространство имен B содержит три описания трех классов ( X, Y и Z ), а пространства имен А и С не содержат ни одного описания классов ).

Ранее в ходе лекций уже обсуждались механизмы boxing и unboxing, реализованные в различных средах разработки программного обеспечения Microsoft .NET. Напомним, что эти механизмы используются для преобразования типов выражений языков программирования из ссылочных в типы-значения и обратно.

Таблица 15.2. Сопоставление ссылочных типов и типов-значений.
  Типы-значения Ссылочные типы
Переменная содержит значение ссылку на значение
Переменная хранится в стеке в куче
Значение по умолчнию 0, false, ‘\0’ null
Оператор присваивания копирует значение копирует ссылку
Пример
int i = 25;
int j = i;
i [25]
j [25]
string s = "John"
string sl = s;
s [ ]-> [John]
sl [ ]->

Рассмотрим более подробно реализацию двух основных семейств типов данных, а именно, ссылочных типов и типов-значений, применительно к языку программирования C#. Для определенности возьмем случай одного из простейших объектов языка программирования C#, а именно, переменной.

В соответствии с названиями, переменная в случае применения типов-значений содержит собственно значение, а при использовании ссылочных типов – не само значение, а лишь ссылку ( указатель ) на него.

Местом хранения переменной, определенной как тип-значение, является стек, а определенной как ссылочный тип"куча" (последнее необходимо для динамического выделения и освобождения памяти для хранения переменной произвольным образом).

Значением, которым переменная инициализируется по умолчанию (необходимость выполнения этого требования диктуется идеологией безопасности Microsoft .NET) в случае определения посредством типа-значения является 0 (для целого или вещественного типа данных), false (для логического типа данных), ‘\0’ (для строкового типа данных), а в случае определения посредством ссылочного типазначение пустой ссылки null.

При выполнении оператора присваивания в случае переменной-значения копируется значение, а в случае переменной-ссылки – ссылка.

Приведенный пример иллюстрирует различия в реализации типов-ссылок и значений (см. табл. 15.2).