Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
CSharp Language Specification.doc
Скачиваний:
13
Добавлен:
26.09.2019
Размер:
4.75 Mб
Скачать

1.3Типы и переменные

В C# все типы подразделяются на две основные категории: типы значений и ссылочные типы. Переменные типа значений непосредственно содержат данные, тогда как переменные ссылочного типа хранят ссылки на соответствующие данные (объекты). Две переменные ссылочного типа могут ссылаться на один объект. Это позволяет изменять объект, на который ссылается одна переменная, выполняя соответствующие операции с другой. Каждая переменная типа значений содержит собственную копию данных. В связи с этим операции с одной переменной не влияют на другую (за исключением переменных параметров ref и out).

Типы значений в C# подразделяются на простые типы, перечисляемые типы, типы структур и обнуляемые типы. Ссылочные типы в C# подразделяются на типы классов, типы интерфейсов, типы массивов и типы делегатов.

В следующей таблице представлен обзор системы типов C#.

Категория

Описание

Типы значений

Простые типы

Целые со знаком: sbyte, short, int, long

Целые без знака: byte, ushort, uint, ulong

Символы Юникода: char

IEEE с плавающей запятой: float, double

Десятичный с повышенной точностью: decimal

Логический: bool

Перечисляемые типы

Пользовательские типы вида enum E {...}

Типы структур

Пользовательские типы вида struct S {...}

Обнуляемые типы

Расширения любых других типов значений, допускающие значение null

Ссылочные типы

Типы классов

Первичный базовый класс для всех типов: object

Строки Юникода: string

Пользовательские типы вида class C {...}

Типы интерфейсов

Пользовательские типы вида interface I {...}

Типы массивов

Одно- и многомерные, например int[] и int[,]

Типы делегатов

Пользовательские типы, например вида delegate int D(...)

Восемь целых типов обеспечивают поддержку 8-, 16-, 32- и 64-разрядных значений со знаком и без знака.

Два типа с плавающей запятой (float и double) представляются в 32-разрядном (одинарная точность) или 64-разрядном (двойная точность) формате IEEE 754.

Тип decimal представляет собой 128-разрядный тип данных, ориентированный на применение в финансовых и денежных вычислениях.

Тип bool в языке C# используется для представления логических значений — true или false.

Обработка знаков и строк в C# выполняется с применением кодировки Юникод. Тип char представляет элемент кода UTF-16, а тип string — последовательность элементов кода UTF-16.

В следующей таблице представлено краткое описание числовых типов C#.

Категория

Разрядность

Тип

Диапазон и точность

Целые со знаком

8

sbyte

–128...127

16

short

–32 768...32 767

32

int

–2 147 483 648...2 147 483 647

64

long

–9 223 372 036 854 775 808... 9 223 372 036 854 775 807

Целые без знака

8

byte

0...255

16

ushort

0...65 535

32

uint

0...4 294 967 295

64

ulong

0...18 446 744 073 709 551 615

С плавающей запятой

32

float

От 1,5 × 10−45 до 3,4 × 1038 с точностью до 7 знаков

64

double

От 5,0 × 10−324 до 1,7 × 10308 с точностью до 15 знаков

Десятичный

128

decimal

От 1,0 × 10−28 до 7,9 × 1028 с точностью до 28 знаков

Для создания новых типов в программах C# используются объявления типов. В объявлении типа указываются имя и члены нового типа. В C# поддерживается определение пользователем типов пяти категорий: типы класса, типы структуры, типы интерфейса, перечисляемые типы и типы делегата.

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

Тип структуры, как и тип класса, представляет структуру, содержащую данные-члены и функции-члены. Однако структуры, в отличие от классов, являются типами значений и для них не требуется выделение памяти в куче. Типы структуры не поддерживают определяемое пользователем наследование. Все типы структуры неявно наследуются от типа object.

Тип интерфейса определяет контракт как именованный набор открытых функций-членов. Класс или структура, реализующие интерфейс, должны предусматривать реализацию функций-членов интерфейса. Интерфейс может наследоваться от нескольких базовых интерфейсов. Класс или структура могут реализовывать несколько интерфейсов.

Тип делегата представляет ссылки на методы с конкретным списком параметров и типом возвращаемого значения. С помощью делегатов методы обрабатываются как сущности, которым можно передавать параметры и которые можно присваивать переменным. Понятие делегата близко к понятию указателя на функцию, используемому в некоторых других языках. Однако делегаты, в отличие от указателей на функции, представляют собой пример объектно-ориентированного и типобезопасного подхода к программированию.

Типы класса, структуры, интерфейса и делегата поддерживают универсальные шаблоны, с помощью которых они могут быть параметризованы с другими типами.

Перечисляемые типы содержат конечное число значений, представляющих собой именованные константы. Для каждого перечисляемого типа существует базовый тип, в качестве которого используется один из восьми целых типов. Набор значений перечисляемого типа соответствует набору значений базового типа.

В C# поддерживаются одно- и многомерные массивы любого типа. В отличие от типов, перечисленных выше, типы массива необязательно объявлять перед использованием. Чтобы сформировать тип массива, необходимо ввести квадратные скобки после имени массива. Например, int[] — это одномерный массив типа int; int[,] — двумерный массив типа int, а int[][] — одномерный массив, состоящий из одномерных массивов типа int.

Обнуляемые типы также не требуется объявлять перед использованием. Для каждого необнуляемого типа значений T существует соответствующий обнуляемый тип T?, который дополнительно содержит значение null. Например, тип int? может содержать любое 32-разрядное целое значение, а также значение null.

В C# применяется унифицированная система типов, в которой значение любого типа может обрабатываться как объект. В C# каждый тип прямо или косвенно наследует от типа класса object, который является первичным базовым классом для всех типов. Обработка значений ссылочного типа как объектов выполняется посредством рассмотрения их как значений типа object. Значения типов значений обрабатываются как объекты с использованием операций упаковки и распаковки. В следующем примере значение типа int преобразуется к типу object и затем обратно к типу int.

using System;

class Test { static void Main() { int i = 123; object o = i; // Boxing int j = (int)o; // Unboxing } }

При преобразовании значения типа значений к типу object выделяется экземпляр объекта (также называется «бокс»), который будет содержать значение, после чего значение копируется в этот экземпляр. При обратном приведении ссылки на object к типу значений проверяется, является ли объект, на который существует ссылка, «боксом» допустимого типа значений. В случае успешного прохождения проверки копируется значение из «бокса».

В унифицированной системе типов C# типы значений могут преобразовываться в объекты «по требованию». Благодаря унификации, как ссылочные типы, так и типы значений могут использовать универсальные библиотеки, использующие тип object.

В C# используются переменные различных типов, в том числе поля, элементы массива, локальные переменные и параметры. Переменная представляет собой ячейку для хранения значений. Каждой переменной присваивается тип, определяющий, какие значения могут храниться в ней, как показано в следующей таблице.

Тип переменной

Возможное содержимое

Необнуляемый тип значений

Значение такого же типа

Обнуляемый тип значений

Значение null или значение такого же типа

object

Пустая ссылка, ссылка на объект любого ссылочного типа или ссылка на упакованное значение любого типа значений

Тип класса

Пустая ссылка, ссылка на экземпляр заданного типа класса или ссылка на экземпляр класса, производного от заданного типа

Тип интерфейса

Пустая ссылка, ссылка на экземпляр типа класса, который реализует заданный тип интерфейса, или ссылка на упакованное значение типа значений, который реализует заданный тип интерфейса

Тип массива

Пустая ссылка, ссылка на экземпляр заданного типа массива или ссылка на экземпляр совместимого типа массива

Тип делегата

Пустая ссылка или ссылка на экземпляр заданного типа делегата

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]