Основные понятия языка программирования C# Ход развития С#: Ветвь языков: В → С → С++ → С# Еще знаковые ЯП: Java и Visual Basic. Язык B - 1963 год, основной создатель - К.Томпсон (Технологический институт Массачусетса (Ken Thompson, MIT). Основная цель разработки языка - реализация операционной системы UNIX. Существовавший язык PL/I (для мэйнфреймов производства компании IBM) был громоздким и меньше подходил для поставленной задачи, чем новое, оригинальное решение ученых-практиков. Язык С изобретен на основе языка B в 1972 году. Авторы - К.Томпсон и Д.Ритчи (исследовательская лаборатория компании AT&T (AT&T Bell Telephone Laboratories). В варианте C язык B расширился за счет явного использования типов, структур и ряда новых операций. Дальнейшее развитие языка происходило в той же организации. Разработчики языка С Кен Томпсон (Kenneth Thompson) Деннис Ритчи (Dennis Ritchie) Известны благодаря двум важнейшим программным разработкам XX века: ОС UNIX и ЯП C. Оба начали свои карьеры в Bell Labs в 1960-х, навсегда изменив компьютерный мир своими идеями. Кен Томпсон больше не в компьютерной индустрии, Деннис Ритчи по-прежнему сотрудник Lucent Technology и работает над новой, основанной на UNIX ОС - Plan9. Язык С++ В 1984 году, Б. Страуструп (Bjarne Stroustrup, Bell Labs) выступил с проектом языка С++ – ООП-расширения языка C, в котором вводится понятие класса как объекта данных. Название C++ для нового языка предложил Р.Маскитти (Rics Mascitti, Bell Labs). Язык С# В 2000 году корпорация Microsoft выпустила в свет C++ нового поколения под названием C#, основной постулат которого: "всякая сущность есть объект". Язык основан на строгой компонентной архитектуре и реализует передовые механизмы обеспечения безопасности кода. C# объединил лучшие черты целого ряда предшественников Язык С# Несмотря на различия между моделью COM (стандарт Microsoft) и моделью Java Beans (стандарт Sun Microsystems) язык C# имеет много общего с языком Java. Немало черт C# унаследовал и от своего предшественника- языка Visual Basic (Microsoft). Черты сходства C# и Java: - Относятся к категории ОО и предполагают единственность наследования. - Механизмы интерфейсов, обработки исключительных ситуаций, процессов или "нитей" (threads). - "Сборка мусора" и пространства имен реализованы сходным образом. - Характеризуются сильной (строгой) типизацией и динамической загрузкой кода при выполнении программы. Черты сходства C# и С++: От прямого предшественника C++ язык C# унаследовал: - "перегруженные" операторы, - небезопасные арифметические операции с плавающей точкой и др. особенности синтаксиса. Но возможности нового языка С# не ограничиваются суммой возможностей его исторических предшественников. Язык С# Подобен языкам Java, C++ и VB, но является компонентноориентированным и более безопасным. Добавлен ряд новых черт (делегаты, индексаторы, механизм (un)boxing и др.) Основные возможности C# Сходство с Java - объектно-ориентированный (единственное наследование) - интерфейсы - исключения - нити (threads) - пространство имен - сильная (строгая) типизация - сборка мусора - отражение (reflection) - динамическая загрузка кода Сходство с С++ - "перегруженные операторы" - арифметические операции с плавающей точкой относятся к небезопасному коду - некоторые особенности синтаксиса Принципиальные решения в С#: • компонентно-ориентированный подход к программированию (характерен для идеологии Microsoft .NET в целом); • свойства как средство инкапсуляции данных (характерно для ООП); • обработка событий (имеются расширения, в том числе в части обработки исключений: try); • унифицированная система типизации (соответствует идеологии Microsoft .NET в целом); • делегаты (delegate – развитие указателя на функцию в C и C++); • индексаторы (indexer – операторы индекса для обращения к элементам класса-контейнера); • перегруженные операторы (развитие ООП); • оператор foreach (обработка всех элементов классов-коллекций, аналог VB); • механизмы boxing и unboxing для преобразования типов; • атрибуты (средство оперирования метаданными в COM-модели); • прямоугольные массивы (набор элементов с доступом по номеру индекса и одинаковым количеством столбцов и строк). Структура программы на C# Структура программы на C# • Программа на C# состоит из одного или нескольких файлов с исходным текстом. Каждый файл имеет расширение .CS (FileName1, FileName2, FileName3). • Файлы могут содержать и не содержать пространства имен (FileName2.cs включает три пространства имен, A, B,C, а FileName1.cs и FileName3.cs не содержат их). • Каждое пространство имен может содержать описание классов (одного или нескольких) и не содержать (пространство имен B содержит три описания трех классов (X, Y и Z), а пространства имен А и С не содержат ни одного описания классов). Преобразование типов Для преобразования типов выражений языков программирования из ссылочных в типы-значения и обратно используются механизмы boxing и unboxing. Сопоставление ссылочных типов и типов-значений. Типызначения Ссылочные типы Переменная содержит значение ссылку на значение Переменная хранится в стеке в куче Значение по умолчанию 0, false, ‘\0’ null Сопоставление ссылочных типов и типов-значений. Типы-значения Пример Ссылочные типы int i = 25; string s = "John" ; int j = i; string sl = s; i [25] j [25] s[]→ sl [ ] → [John] Реализация основных семейств типов данных: ссылочных и типов-значений в C#. Простейший объект C# - переменная. В случае применения типов-значений переменная содержит собственно значение, а при использовании ссылочных типов – не само значение, а лишь ссылку (указатель) на него. Объект – переменная в С# Место хранения переменной (определенной как типзначение) - стек, а определенной как ссылочный тип – "куча". Значение, которым переменная инициализируется по умолчанию - в случае типа-значения: 0 (для целого, вещественного типа данных), false (для логического типа данных), ‘\0’(для строкового типа данных), в случае ссылочного типа – значение пустой ссылки null. При выполнении оператора присваивания в случае переменной-значения копируется значение, а в случае переменной-ссылки – ссылка. Объект – константа в С# Примеры описания констант посредством оператора перечисления enum (такой способ описания констант изначально ориентирован на написание безопасного кода, так как содержит обязательную инициализацию). Оператор перечисления enum – это список поименованных констант. Объект – константа в С# Описание производится непосредственно в пространстве имен с необходимой областью видимости: enum Color {red, blue, green} enum Access {personal=1, group=2, all=4} enum Access1 : byte {personal=1, group=2, all=4} Пример использования константы после ее описания: Color c = Color.blue; Для перечислимых констант нужно указать полное имя: Access a = Access.personal | Access.group; if((Access.personal & a) != 0) Console.WriteLine("access granted"); Определения типа для объекта - оператор typeof Оператор typeof - для любого заданного типа возвращает дескриптор этого типа. Дескриптор типа для объекта o возвращается операцией o.GetType(). Пример: Type t = typeof(int); Console.WriteLine(t.Name); При выполнении тип рассматриваемого выражения будет определен системой как Int32. Оператор sizeof - возвращает размер элемента данного типа (в байтах). Применим только к типам-значениям и используется в блоках небезопасного кода (т.к. размер структур может изменяться от среды реализации); необходима компиляция кода командой csc /unsafe xxx.cs. Пример (блоки небезопасного кода - словом unsafe): unsafe { Console.WriteLine( sizeof(int)); Console.WriteLine( sizeof(MyEnumType)); Console.WriteLine( sizeof(MyStructType)); } Структуры struct Пример описания структуры Point, моделирует точку на плоскости: struct Point { public int x, y; public Point (int x, int y) { this.x = x; this.y = y; } public void MoveTo (int a,int b) { x=a; y=b; } } Структура struct Point Координаты точки x, y - атрибуты объекта, поля структуры. Операция Point - функция инициализации объекта - конструктор. Унаследованный от C++ указатель this ссылка на текущий объект. Операция (метод) MoveTo изменяет текущее местоположение точки на пару координат (a,b). Использование объектаструктуры Необходимо проинициализировать объект-значение в стеке посредством конструктора. Затем - вызвать метод MoveTo: Point p = new Point(3, 4); p.MoveTo(10, 20); В примере фрагмента программы на C# дважды фигурировал идентификатор Point. Уместно вспомнить о проблеме коллизий переменных и возможных путях ее преодоления. В языке SML переменные могут быть описаны либо глобально (описание распространяется на весь текст программы), либо локально в теле функции (это описание распространяется на весь текст функции). Область описания объектов В C#, где объекты имеют более сложную структуру, вводится понятие области описания - фрагмента программы, к которому относится данное описание. Объекты языка C# могут быть описаны: • в пространстве имен (классы, интерфейсы, структуры, перечисления, делегаты); • в классе, интерфейсе, структуре (поля, методы, свойства, события, индексаторы); • в перечислении (перечисляемые константы); • в блоке (локальные переменные). Область описания объектов Принимаются контекстные соглашения: • Недопустимо двукратное описание в пределах данной области описания. • Последовательность описаний является произвольной. Исключение - локальные переменные, которые описывают до первого использования. Принимаются соглашения об областях видимости. • Любой идентификатор виден лишь из своей области описания. • Область видимости можно изменить посредством модификаторов (private, protected). Пространства имен языка C# Рассмотрим два файла X.cs и Y.cs с текстами на C#. Содержание файла X.cs: namespace A { class C ... interface I... ... struct S... ... enum e ... ... delegate d ... namespace B { // полное имя: A.B ... } } Пространства имен языка C# Содержание файла Y.cs: namespace A { ... namespace B { ... } namespace C { ... } } В файле X.cs - описания пространств имен A и B, в файле Y.cs – A, B и C, в обоих случаях последующие пространства имен вложены в A. При обращении к вложенному пространству имен нужно указывать его полное имя, например A.B. Пространства имен из разных файлов, имеющие один и тот же идентификатор, составляют единую область описания. Вложенные пространства имен составляют собственную (отдельную) область описания. Одна из черт, унаследованных C# от C, является блок операторов – { … }. В С# виды блоков: void foo (int x) { // блок методов ... локальные переменные ... { // вложенный блок ... локальные переменные ... } for (int i = 0; ...) { // блок структурированных операторов ... локальные переменные ... }} Пример описания локальных переменных в C# void foo(int a) { int b; if (...) { int b; // ошибка: переменная b уже описана в другом блоке int c; // пока описание корректно int d; ... } else { int a; // ошибка: переменная а уже описана во внешнем блоке int d; // конфликта с переменной d из предыдущего блока нет } for (int i=0;...){ ... } for (int i=0;...){ ... } // фрагмент корректен: нет конфликтов с // переменной i из предыдущего цикла int c; // ошибка: c уже описана в данном пространстве имен } Функция foo с одним целочисленным аргументом a, не возвращает значения. Из примера видно, что коллизии описаний переменных возникают в случаях множественного описания внутри одного и того же блока или пространства имен. Пример: три файла с описаниями структур данных, оформленными в виде отдельных пространств имен: Color.cs namespace Util { public enum Color { ... } } Figures.cs namespace Util.Figures { public class Rect { ... } public class Circle { ... } } Triangle.cs namespace Util.Figures { public class Triangle { ... } } При использовании полного имени пространства имен (Util.Figures) можно обойтись без конкретизации классов (Rect), описанных внутри этого пространства имен. Но в случае обращения к классам вне данного пространства имен необходимо использовать полное имя объекта (Util.Color): using Util.Figures; class Test { Rect r; // без указания полного имени т.к. // используем (Util.Figures) Triangle t; Util.Color c; // c указанием полного имени } Очевидные преимущества С#: - - - Претендует на подлинную объектную ориентированность Призван практически реализовать компонентно-ориентированный подход, способствующий меньшей машинно-архитектурной зависимости программного кода, большей гибкости, переносимости и легкости повторного использования (фрагментов) программ. Изначальная ориентация на безопасность кода Унифицированная, максимально близкая по масштабу и гибкости к Common Type System, принятой в Microsoft .NET, система типизации Расширенная поддержка событийно-ориентированного программирования Язык C# является "родным" для создания приложений в среде Microsoft .NET, поскольку тесно и эффективно интегрирован с ней Язык C# не просто сумма достоинств современных ЯП (Java, C++, Visual Basic) , а ЯП нового поколения. Недостатки С#: • Язык C# имеет сложный синтаксис (~ 75% его синтаксических возможностей аналогичны Java, 10% подобны C++, а 5% – взяты из языка Visual Basic). • Объем свежих концептуальных идей в языке C# невысок (по мнению исследователей он составляет ~ 10% от общего объема конструкций языка). • Утверждение, что язык C# является чисто объектным, допускает неоднозначную интерпретацию. Профессор K. Гуткнехт (K.Gutknecht) (г. Цюрих) предложил альтернативную ("активную") объектную модель для разработанного им языка программирования Zonnon. Недостатки С#: • На сегодня компилятор и среда разработки ПО, поддерживающие язык C#, обладают относительно невысокой производительностью (код программы на C# компилируется и выполняется ~ в 100 раз медленнее, чем тот же код на языке C). Производительность программ на C# сравнима с тем же показателем для языка Java. • Пока программы на C#, не могут функционировать под управлением альтернативных ОС (ведутся работы по обеспечению совместимости с ОС Linux и FreeBSD семейства UNIX). Эти отдельные недостатки носят субъективный, локальный, временный характер. Базовые конструкции языка C# Объявление и инициализация переменных: Тип_переменной имя_переменной [=значение]; Примеры: int x; //обьявление переменной x x=100; //инициализация переменной x long w,z=100; //обьявление переменных w и z и //инициализация z long q=100*z; //обьявление переменной с //динамической инициализацией Язык C# - ЯП со строгим контролем типов данных. В C# две основные категории встроенных типов данных - простые типы и ссылочные типы. Область видимости переменной в C# - блок кода, заключенный в фигурные скобки {}. Создание переменных осуществляется при входе управления программой в область видимости; уничтожение - при выходе из нее. Основные управляющие операторы Условный оператор: if (условие) оператор [else оператор]; if (условие1) оператор1; else if (условие2) оператор2; else if (условие3) оператор3;... Оператор выбора: switch (выражение){ case константа1: оператор1; ... break; case константа2: операторX1; ... break; ... default: операторZ1; ... break;} Основные управляющие операторы Оператор цикла: for(инициализация, условие_выхода, итерация) оператор; while (условие_продолжения) оператор; do оператор; while (условие продолжения); Пространства имен - определяет область объявления данных, что позволяет хранить каждый набор имен данных отдельно от других наборов. В С# имена, объявленные в одном пространстве имен, не конфликтуют с именами, объявленными в другом пространстве имен. Библиотека .NET Framework (библиотека С#) использует пространство имен System. Чтобы сделать видимыми пространства имен без указания полного имени (с использованием оператора '.') в C# - директива using: using имя_пространства_имен; В C# возможно использование псевдонимов для имен вида: using псевдоним = имя; Объявление пространства имен в C# : namespace имя {члены_пространства_имен}