типы
Целочисленные типы
byte, sbyte (8bit), short, ushort (16bit)
int, uint (32bit), long, ulong (64bit)IEEE-стандарт для вещественных типов
float (точность - 7 цифр)
double (точность - 15–16 цифр)Числовой тип расширенной точности:
decimal (точность - 28 десятичных цифр)Символьные типы:
char (один символ длиной 2 байта - UNICODE)
string (имеет большой набор операций; является ссылочным типом)
Булевский тип
bool (отдельный тип, не совместимый с int)
(C) Сафонов В.О. 2012
C#: перечисления
Именованные элементы; возможность явной нумерации отсутствует
Строгая типизация; отсутствует автоматическое
приведение к int
Лучше использовать Color.Blue, чем целочисленное
выражениеБолее прозрачное и легкое для сопровождения
Столь же простое, как int (имеет такое же
представление)
Базовый класс перечисления - System.Enum, который не является типом-перечислением; потомок
System.ValueType
Пример:
enum Color // : byte
{
Red,
Green,
Blue,
Yellow
};
(C) Сафонов В.О. 2012
C#: массивы
Элементы нумеруются начиная от 0; порядок элементов фиксирован
Строятся на базе класса .NET System.ArrayОбъявления: только тип и форма; границы не указываются (история: Algol 68 – “формальный описатель”)
int[] SingleDim;int[,] TwoDim;
int [][] ArrayOfArrays;
Создаются оператором new (указываются границы и инициализация)
SingleDim = new int[20];
TwoDim = new int[,]{{1,2,3},{4,5,6}};ArrayOfArrays = new int[1][];
ArrayOfArrays[0] = new int[]{1,2,3};
(C) Сафонов В.О. 2012
C#: пространства имен
Каждое определение должно принадлежать
некоторому пространству имен
Служат для разрешения конфликтов имен
Упорядочивают и систематизируют их
Обеспечивают лучшую понимаемость APIМогут и должны быть вложенными
Группируют классы и типы, в соответствии с их
семантикой
В объявлении указывается ключевое слово namespace namespace MyLectures
{ public class Lecture1 … }
При использовании указывается ключевое слово using: using MyLectures; … Lecture1 …
(C) Сафонов В.О. 2012
C#: Интерфейсы
Описание семантических соглашений (контрактов) между сторонами
Поддерживают компонентную ориентированность
и семантику (специфицируют поведение)Абстрактные определения методов и свойств (без их реализации)Поддерживают простое и множественное наследованиеПример:
interface IPersonAge
{
int YearOfBirth {get; set;} int GetAgeToday();
}
(C) Сафонов В.О. 2012
C#: Классы
Реализуют код и данные |
|
Являются |
|
семантическими |
|
единицами |
|
Реализуют интерфейсы |
|
Наследуют от общего |
|
базового класса |
|
Содержат: |
|
Поля: переменные- |
|
элементы |
|
Свойства: |
|
обрабатываются парами |
|
методов get/set |
|
Методы: |
|
функциональность |
|
Особые элементы: |
|
индексаторы, события, |
|
делегаты |
(C) Сафонов В.О. 2012 |
|
|
public class Person : IPersonAge
{
private int YOB;
public Person()
{
}
public int YearOfBirth
{
get { return YOB; }; set { YOB = value; };
}
public int GetAgeToday()
{
return Today()- YearOfBirth
};
}
C#: классы
(продолжение)
История: Концепция класса была впервые введена в языке Simula-67 (1967)
Сравните: C++ по своему происхождению по существу является гибридным языком, сочетающим синтаксис C и классы в стиле языка Simula
Сравните: Классы в Smalltalk намного более динамичны: набор элементов окончательно определяется во время выполнения. Это может быть полезно для специфических областей, например, для искусственного интеллекта, но менее эффективно
Сравните: Классы в Java, по сравнению с C#, не содержат индексаторов, делегатов и событий, - хотя идея использования пар методов getX / setX как единого “свойства” X взята из Java и используется в технологии Java Beans
C# 2.0: параметризованные типы и интерфейсы (generics); пошаговое определение классов (partial classes)
Важная новость: Sun приняла решение о реализации в Java 1.7 (синтаксиса) свойств в стиле C# (источник: Sun Tech Days, Санкт- Петербург, апрель 2007)
(C) Сафонов В.О. 2012
C# 2.0: пошаговое определение классов (partial classes)
Класс может быть определен по частям в нескольких файлах исходного кода (единицах компиляции) – это удобно для пошаговой разработки программ и быстрого внесения изменений // исходный файл 1
partial class C { }public void M() { … }
// исходный файл 2 partial class C { }public void N() { … }
Множество элементов пошагово определенного класса является объединением всех множеств его элементов, определенных в отдельных исходных файлах
(C) Сафонов В.О. 2012
C#: Структуры
Группируют данные с кодомАналогичны классам, но:
Отсутствует наследованиеЯвляются типами-значениями, в отличие от классов и
интерфейсовКлассы и структуры
Struct “Облегченные” контейнеры данных; типы- значения
Class Объекты; ссылочные типыВниманию программистов на C++ !
В C# структура - это НЕ “класс, в котором все поля и методы
– public”)
Сравните с подходом Б. Страуструпа в книге “Язык
программирования C++”)
Примерstruct: Point
{
double X; double Y;
void MoveBy(double dX, double dY) { X+=dX; Y+=dY; }
}
(C) Сафонов В.О. 2012
C#: структуры
(продолжение)
История: Структуры были предложены разработчиками языка PL/1 в фирме IBM (в середине 1960-х гг.)
История: В языке ALGOL-68 концепция структуры была
уточнена
История: В языке Pascal (1970) было введено аналогичное
понятие – записи (records)
В ранних языках структуры не содержали кода, а
состояли только из описаний данных
C++: структуры могут включать процедуры, а не только
данные (поля)
Сравните: Java не содержит структур, в ней есть только классы. По этой причине, чтобы определить на Java простейшую информационную структуру, такую как точка (X, Y), приходится определять новый класс с набором виртуальных (!) методов для обработки точек
(C) Сафонов В.О. 2012
C#: Свойства
Весьма полезный гибрид поля и методов: поле, доступ к которому и присваивание которому – программируемые операцииИстория: Популярной идеей 1970-х гг. было ПРОЦЕДУРНОЕ
ПРЕДСТАВЛЕНИЕ ДАННЫХ И ЗНАНИЙ. Свойства языка C# - удачная реализация данной идеи. Отметим, что значение свойства, если оно требуется, может вообще быть вычислено (либо найдено где-либо), а не храниться явно в объекте, которому оно принадлежитИспользуются для:
Реализации элементов данных, которые не могут быть изменены (для этого достаточно просто не включать метод set в описание свойства)
Проверок перед присваиванием (например, проверок полномочий)
РеализацииstringвычисляемыхName (активных) значенийПример: {
get { return name; } set { name = value; }
}
(C) Сафонов В.О. 2012
C#: Индексаторы
Способ определить контейнер как “абстрактный
массив”Основан на концепции свойства
Обеспечивает доступ к компонентам объекта по
индексам
Индексы могут быть любого типа (обычно – integer
или string)
История: в более ранних шароко известных языках
аналогов нетПример:
object this[string index]
{
get { return Dict.Item(index); } set { Dict.Add(index,value); }
}
(C) Сафонов В.О. 2012
C#: Делегаты
История: Концепция делегирования по-разному понимается в различных языках и моделях программирования; иногда “делегирование” означает “выборочное наследование реализаций”
Что именно делегируется делегатам .NET / C# ? Чаще всего – обработка события
Аналогичны указателям функций в C и C++
Очень важная особнность: делегаты строго типизированныОно задает типизированную сигнатуру, или заголовок, некоторого метода:
delegate void Clicked(Element e, Point p);
Фактический делегат является экземпляром данного типа:
Clicked MyClickHandler
=new Clicked(obj.OnButtonClick);
Аргумент передается конструктору делегата
Ссылки на объект и на метод
Метод должен иметь ту же сигнатуру
void OnButtonClick(Element e, Point p)
{... };
(C)Сафонов В.О. 2012
C#: События
История: Известно несколько распространенных моделей событий: в X Window, Turbo Vision, Java и др.Сравните: В Java события обрабатываются слушателями событий, но эта возможность не является частью языка, я является лишь элементом (соглашением) технологии Java Beans
C#: Модель событий встроена в язык
Управление событиями полностью реализовано в C#При описании событий используются типы-делегатыОбъявление создает источник событий для связывания:
event Clicked OnClicked;
Событие связано с его источником с помощью делегатовДобавление обработчика события:
btnAction.OnClicked += MyClickHandler;
Удаление обработчика события:
btnAction.OnClicked -= MyClickHandler;
Источник события использует метод-делегат:
OnClicked(this,PointerLocation);
(C) Сафонов В.О. 2012
C#: Атрибуты
Аналогичны атрибутам в IDL (в модели CORBA)
Нет аналогов в Java (но в Java 1.5 введены
аннотации!)
Декларативный доступ к функциональностиРасширяемость: пользовательские (custom) атрибутыДопускают добавление кода:
[Transaction(TransactionOption.Required)]
Аннотации времени выполнения
class MyBusinessComponent :ServicedComponent { ... }
[PersonFirstName] String Vorname;
[PersonFirstName]ДекларативнаяStringсемантикаPrimarioNome;
(C) Сафонов В.О. 2012
