Украина |
Лекция 4: Основные понятия языка программирования C#
Перейдем к более подробному описанию основных типов, входящих в состав Common Type System (CTS) Microsoft .NET. При этом прикладное исследование языков программирования произведем в форме сопоставления отображений фрагментов систем типизации языков программирования SML и C# в систему типов CTS.
Для большей наглядности сопоставления сведем отображения в таблицу на табл. 15.3.
Даже из предварительного анализа таблицы видно, что система типизации языка программирования С# значительно богаче по сравнению с языком программирования SML. Можно заметить, что всякому типу языка программирования SML соответствует некоторый тип языка программирования С#, и их названия зачастую совпадают или бывают схожими.
Наконец, отметим, что все без исключения типы обоих языков программирования однозначно отображаются в систему типизации Microsoft .NET, верхним иерархическим элементом которой является пространство имен System.
Кроме понятия переменной, которое уже рассматривалось ранее в связи с типами-значениями и ссылочными типами, интересно провести исследование объектов-констант в языке программирования C#.
Напомним, что константные объекты в комбинаторной логике можно моделировать посредством комбинатора-канцелятора К с характеристикой Kxy = x.
Рассмотрим ряд примеров описания констант посредством оператора перечисления (заметим, что применяемый в C# способ описания констант изначально ориентирован на написание безопасного кода, поскольку содержит обязательную инициализацию ).
Оператор перечисления enum языка C# представляет собой список поименованных констант . Описание производится непосредственно в пространстве имен с областью видимости, которую необходимо обеспечить для константы:
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");
Подобно языку программирования SML в языке C# реализована возможность определения типа для того или иного языкового объекта. Для реализации такой возможности используется оператор typeof, который для любого заданного типа возвращает дескриптор этого типа .
Заметим, что дескриптор типа для объекта o возвращается операцией o.GetType(). Рассмотрим пример, иллюстрирующий использование оператора typeof:
Type t = typeof(int); Console.WriteLine(t.Name);
При выполнении данного примера тип рассматриваемого выражения будет определен системой как Int32, что вполне соответствует данным из сравнительной таблицы отображения типов языковых объектов C# и SML в систему типизации CTS Microsoft .NET.
Еще одной практически важной конструкцией C#, оперирующей типами, является оператор sizeof, который возвращает размер элемента данного типа (в байтах). Данный оператор применим только к типам-значениям и используется лишь в блоках небезопасного кода (т.к. размер структур может изменяться в зависимости от среды реализации); необходима компиляция кода командой
csc /unsafe xxx.cs.
Приведем пример использования оператора sizeof (заметим, что блоки небезопасного C#-кода выделяются посредством ключевого слова unsafe ):
unsafe { Console.WriteLine( sizeof(int)); Console.WriteLine( sizeof(MyEnumType)); Console.WriteLine( sizeof(MyStructType)); }
Одним из важнейших видов основных объектов языка программирования C# являются структуры (аналоги структур имеются и в языке SML; в языках функционального программирования с примитивной системой типизации аналогами структур могут служить списки ).
Рассмотрим пример описания структуры 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; } }
Заметим, что координаты точки x, y (в простейшем случае целочисленные), которые используются для определения ее положения, являются атрибутами объекта или полями структуры.
Операция Point является функцией инициализации объекта и называется конструктором. Обратите внимание, что унаследованный от C++ указатель this представляет собой ссылку на текущий объект.
Наконец, операция (или, иначе, метод ) MoveTo изменяет текущее местоположение точки на пару целочисленных координат (a,b).
Для использования объекта-структуры необходимо проинициализировать объект-значение в стеке посредством конструктора. Затем можно вызвать метод MoveTo:
Point p = new Point(3, 4); p.MoveTo(10, 20);
Мы познакомились с одним из основных видов объектов языка программирования C#, а именно, со структурами.
В предыдущем примере фрагмента программы на C# дважды фигурировал идентификатор Point. В связи с этим уместно вспомнить о проблеме коллизий переменных и возможных путях ее преодоления (в предыдущей части курса для решения этой задачи использовался формализм, известный под названием чисел де Брейна). В языке программирования SML переменные могут быть описаны либо глобально (это описание распространяется на весь текст программы), либо локально в теле функции (это описание распространяется на весь текст функции).
В языке программирования C#, где объекты имеют существенно более сложную структуру, вводится понятие области описания, под которой понимают фрагмент программы, к которому относится данное описание.
Объекты языка программирования C# могут быть описаны:
- в пространстве имен ( классы, интерфейсы, структуры, перечисления, делегаты );
- в классе, интерфейсе, структуре (поля, методы, свойства, события, индексаторы );
- в перечислении (перечисляемые константы );
- в блоке (локальные переменные).
При этом принимаются следующие контекстные соглашения.
Во-первых, недопустимо двукратное описание в пределах данной области описания. Во-вторых, последовательность описаний является произвольной. Исключение составляют локальные переменные, которые необходимо описать до первого использования.
Кроме того, принимаются следующие соглашения об областях видимости.
Во-первых, любой идентификатор виден лишь из своей области описания. Во-вторых, область видимости можно изменить посредством модификаторов ( private, protected ).
В процессе изучения структуры программы на языке C# неоднократно употреблялся термин "пространство имен". В силу существования более значимых понятий объектно-ориентированного подхода к программированию в целом и языка программирования C# в частности, приводилось лишь общее описание данного термина. Рассмотрим пространства имен языка программирования C# более подробно.
Рассмотрим два файла X.cs и Y.cs, содержащих исходные тексты программ на языке C#.
Содержание файла X.cs:
namespace A { class C ... interface I... ... struct S... ... enum e ... ... delegate d ... namespace B { // полное имя: A.B ... } }
Содержание файла Y.cs:
namespace A { ... namespace B { ... } namespace C { ... } }
Заметим, что в файле X.cs содержатся описания пространств имен A и B, а в файле Y.cs – A, B и C, причем в обоих случаях последующие пространства имен вложены в A. При обращении к вложенному пространству имен нужно указывать его полное имя, например A.B.
Необходимо отметить, что пространства имен из разных файлов, имеющие один и тот же идентификатор, составляют единую область описания. Заметим также, что вложенные пространства имен составляют собственную (отдельную) область описания.