Национальный исследовательский ядерный университет «МИФИ»
Опубликован: 19.08.2004 | Доступ: свободный | Студентов: 6054 / 400 | Оценка: 4.16 / 3.86 | Длительность: 10:50:00
Специальности: Программист

Лекция 4: Основные понятия языка программирования C#

Перейдем к более подробному описанию основных типов, входящих в состав Common Type System (CTS) Microsoft .NET. При этом прикладное исследование языков программирования произведем в форме сопоставления отображений фрагментов систем типизации языков программирования SML и C# в систему типов CTS.

Для большей наглядности сопоставления сведем отображения в таблицу на табл. 15.3.

Таблица 15.3. Сопоставление отображений типов языков SML и C# в систему типов .NET.
C# CTS (.NET) SML Диапазон
sbyte System.SByte --- -128..127
byte System.Byte byte 0..255
short System.Int16 int -32768..32767
ushort System.UInt16 word 0..65535
long System.Int64 --- -263..263-1
float System.Single real +1.5E-45..+3.4E+38 (32 Bit)
double System.Double --- +5E-324..+1.7E+308 (64 Bit)
decimal System.Decimal --- +1E-28..+7.9E+28 (128 Bit)
bool System.Boolean bool true, false
char System.Char char Символ (в коде unicode)

Даже из предварительного анализа таблицы видно, что система типизации языка программирования С# значительно богаче по сравнению с языком программирования 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.csA, B и C, причем в обоих случаях последующие пространства имен вложены в A. При обращении к вложенному пространству имен нужно указывать его полное имя, например A.B.

Необходимо отметить, что пространства имен из разных файлов, имеющие один и тот же идентификатор, составляют единую область описания. Заметим также, что вложенные пространства имен составляют собственную (отдельную) область описания.