Основные понятия языка программирования C

advertisement
Основные понятия
языка
программирования
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 имя {члены_пространства_имен}
Download