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

11.3Различия между классом и структурой

Структуры имеют несколько важных отличий от классов:

  • Структуры являются типами значения (§11.3.1).

  • Все типы структур неявным образом наследуются из класса System.ValueType (§11.3.2).

  • При присваивании переменной с типом структуры создается копия присваиваемого значения (§11.3.3).

  • Значением по умолчанию для структуры является значение, при котором все поля типов значения устанавливаются в соответствующие значения по умолчанию, а все поля ссылочного типа — в значение null (§11.3.4).

  • Операции упаковки и распаковки используются для выполнения преобразования между типом структуры и объектом object (§11.3.5).

  • Ключевое слово this в структурах имеет другой смысл (§7.6.7).

  • Объявления полей экземпляров для структуры не могут включать инициализаторы переменных (§11.3.7).

  • В структуре не разрешается объявлять конструктор экземпляров без параметров (§11.3.8).

  • В структуре не может быть объявлен деструктор (§11.3.9).

11.3.1Семантика значений

Структуры относятся к типам значения (§4.1) и считаются имеющими семантику значения. Наоборот, классы относятся к ссылочным типам (§4.2) и считаются имеющими семантику ссылок.

Переменная с типом структуры непосредственно содержит данные структуры, в то время как переменная с типом класса содержит ссылку на данные, которые являются объектом. Если структура B содержит поле экземпляра с типом A, который является типом структуры, зависимость A от B приведет к возникновению ошибки компиляции. Структура X имеет прямую зависимость от структуры Y в том случае, если X содержит поле экземпляра с типом Y. В соответствии с этим определением полный набор структур, по отношению к которым структура является зависимой, представляет собой транзитивное замыкание связи с типом имеет прямую зависимость от. Например:

struct Node { int data;

Node next; // error, Node directly depends on itself

}

является ошибкой, поскольку структура Node содержит поле экземпляра с собственным типом. Другой пример. Код

struct A { B b; }

struct B { C c; }

struct C { A a; }

является ошибкой, поскольку типы A, B и C зависят друг от друга.

В классах две переменные могут ссылаться на один объект, в результате чего действия с одной переменной могут повлиять на объект, на который ссылается другая переменная. В структурах каждая из переменных имеет собственную копию данных (за исключением переменных параметров ref и out) и действия с одной из переменных не могут повлиять на другую переменную. Более того, поскольку структуры не относятся к ссылочным типам, значения с типом структуры не могут быть равны null.

При объявлении

struct Point { public int x, y;

public Point(int x, int y) { this.x = x; this.y = y; } }

выполнение фрагмента кода

Point a = new Point(10, 10); Point b = a; a.x = 100; System.Console.WriteLine(b.x);

возвратит значение 10. При присваивании значения переменной a переменной b создается копия этого значения, поэтому на переменную b не влияет изменение значения переменной a.x. Если бы структура Point была объявлена как класс, выходным значением было бы 100, поскольку переменные a и b ссылались бы на один и тот же объект.

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