Для того чтобы различные языки программирования могли осмысленно общаться между собой, необходимо ввести единую систему типов, которая была бы достаточно полной и при этом оставалась бы ясной. В.NET такую роль выполняет Common Type System (CTS).
Основные функции CTS следующие.
1. Формирует среду, способствующую межъязыковой интеграции, безопасности типов, а также высокой производительности исполнения кода.
2. Определяет правила, управляющие наследованием типов, виртуальными методами и продолжительностью существования объектов.
3. Определяет правила, гарантирующие, что типы данных объектов, написанные на разных языках, смогут взаимодействовать друг с другом.
4. Определяет правила для видимости типов и доступа к членам типа.
Общая система типов.NET является «каркасом», в рамки которого должна поместиться система типов любого языка программирования, допускающего компиляцию в CIL (рис.2.2).
Рисунок 2.2. Система типов.NET
Два основных вида данных в системе типов.NET - это типы-значения (value types) и типы-ссылки (reference types). Основное различие между ними заключается в том, что тип-значение представляет собой просто последовательность битов в памяти, а ссылочный тип дополнительно обладает "индивидуальностью". Например, 32-битовое знаковое целое является типом-значением. Если будут сравниваться два любых целых, то они будут считаться равными, если содержат одинаковое число. С другой стороны, два разных объекта, представляющие один и тот же класс, могут содержать абсолютно одинаковые данные, но при этом не будут равными, так как указывают на разные участки памяти.
|
|
Некоторые типы данных используются настолько часто, что компиляторы позволяют обращаться с ними по упрощенной схеме. Например, в С# возможно следующее определение:
string s = "Hello C#";
Эта форма записи удобна, коротка и читабельна. Однако под таким оператором скрыта определенная последовательность действий, создающая экземпляр класса System.String с сохранением ссылки на область памяти, в которой будет храниться текстовое значение, и инициализирующая эту область заданной строковой константой.
Вообще говоря, string является обычным типом, который ничем не отличается от других типов данных. Типы данных, напрямую поддержанные компилятором и допускающие подобные сокращения записи, называются примитивными типами. Примитивные типы преимущественно являются типами-значениями, и память под них выделяется на стеке данного потока. Большинство примитивных типов различных языков программирования проецируется на типы данных, существующие в базовой библиотеке классов.NET.
Контрольные вопросы
|
|
1. Что является основой платформы.NET?
2. В чем отличие стратегии выполнения программ в рамках платформы.NET от стратегий выполнения программ компилируемого и интерпретируемого типов?
3. Какую роль играет Common Intermediate Language (CIL) в платформе.NET?
4. Каким образом в рамках платформы.NET обеспечивается безопасность исполняемого кода?
5. Назовите преимущества использования общей системы типов.NET.
6. В чем принципиальное отличие типов-значений от типов-ссылок?
3. Основы языка С#
3.1. Структура программы на С#
Одна из принципиальных отличительных особенностей языка C# в том, что он является полностью объектно-ориентированным. Это означает, в частности, что основными «строительным блоками» программы на C# являются классы. Класс здесь – это специальная синтаксическая конструкция, имеющая имя и состоящая из трех основных частей:
· полей;
· методов;
· свойств (специальная конструкция, занимающая промежуточное положение между полем и методом) [4,5].
Таким образом, программа на C# – это всегда как минимум один класс, состоящий из одного метода, с выполнения которого начинается выполнение программы.
Простейший класс С# может быть определен следующим образом:
// Обычно для файлов классов С# используется расширение
// *.cs
using System;
class HelloClass
{
public static int Main(string[] args)
{
Console.WriteLine("Hello.World");
return 0;
}
}
В программе создан класс HelloClass, который поддерживает единственный метод - Main(). В любом приложении С# должен быть определен класс с методом Main(). Этот метод будет использован как точка входа приложения - то есть работа приложения начнется с выполнения этого метода. В принципе можно создать несколько классов с методами Main(), однако в этом случае придется явно указать, какой из этих методов будет использован в качестве точки входа. Если такое указание будет пропущено, результатом станет сообщение компилятора об ошибке.
Первая буква в названии метода Main() - заглавная. Такое написание обязательно, так как синтаксис языка C# является регистрозависимым.
В данном случае метод Main() был определен как public и как static. Подробнее об этих ключевых словах будет рассказано далее. Пока достаточно отметить, что ключевое слово publiс в определении метода означает, что этот метод будет доступен извне, а ключевое слово static говорит о том, что этот метод позиционируется на уровне класса, а не отдельного объекта и будет доступен даже тогда, когда еще не создано ни одного экземпляра объекта данного класса.
Кроме того, метод Main() принимает единственный параметр, который должен быть набором символов (string[] args). Хотя этот параметр в программе нигде не встречается, его можно использовать для приема параметров, если приложение запускается из командной строки.
Вся программная логика HelloClass заключена в самом методе Main(). Этот метод обращается к классу Console, определенному внутри пространства имен System. Один из членов метода Console - статический метод WriteLine(), который можно использовать для вывода строки на системную консоль. Поскольку метод Main() был определен как int, то он должен вернуть целочисленное значение (в нашем случае «0» - стандартный код успешного завершения программы).