Основные понятия C

Download Report

Transcript Основные понятия C

Основные понятия
языка
программирования
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 содержит 3
описания трех классов (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);
В примере - дважды идентификатор Point.
Проблемы коллизий переменных и возможных
путях ее преодоления.
В языке SML переменные могут быть описаны
либо глобально (описание распространяется
на весь текст программы), либо локально в
теле функции (описание - на весь текст
функции).
Область описания объектов
В C#, где объекты имеют более сложную
структуру, вводится понятие области
описания - фрагмента программы, к которому
относится данное описание.
Объекты языка C# могут быть описаны:
• в пространстве имен (классы, интерфейсы,
структуры, перечисления, делегаты);
• в классе, интерфейсе, структуре (поля, методы,
свойства, события, индексаторы);
• в перечислении (перечисляемые константы);
• в блоке (локальные переменные).
Область описания объектов
Принимаются контекстные соглашения:
• Недопустимо двукратное описание в пределах
данной области описания.
• Последовательность описаний является
произвольной. Исключение - локальные
переменные, которые описывают до первого
использования.
Принимаются соглашения об областях
видимости.
• Любой идентификатор виден лишь из своей
области описания.
• Область видимости можно изменить
посредством модификаторов (private, protected).
Пространства имен языка C#
Пример: два файла X.cs и Y.cs
Файл X.cs - описания пространств имен A и B:
namespace A {
class C ...
interface I...
... struct S...
... enum e ...
... delegate d ...
namespace B { // полное имя: A.B
... }
}
Файл Y.cs - описания пространств имен A, B и С:
namespace A {
...
namespace B {
...
}
namespace C {
...
} }
В обоих случаях пространства имен вложены в A.
При обращении к вложенному пространству имен нужно
указывать его полное имя, например A.B.
Пространства имен из разных файлов, имеющие один и тот
же идентификатор, составляют единую область описания.
Вложенные пространства имен составляют собственную
(отдельную) область описания.
Пример описания локальных переменных
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) , а ЯП нового поколения.
Недостатки С#:
• Сложный синтаксис (~ 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=100;
long w,z=100;
long q=100*z;
//обьявление переменной x
//инициализация переменной x
//обьявление переменных w и z и
//инициализация 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 имя {члены_пространства_имен}