Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
CSharp_Prog_Guide.doc
Скачиваний:
16
Добавлен:
16.11.2019
Размер:
6.22 Mб
Скачать

Структуры

Структуры определяются с помощью ключевого слова struct, например:

--

Структуры используют большую часть того же синтаксиса, что и классы, однако они более ограничены по сравнению с ними.

  • В объявлении структуры поля не могут быть инициализированы, если только они не объявлены как постоянные или статические.

  • Структура не может объявлять используемый по умолчанию конструктор (конструктор без параметров) или деструктор.

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

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

В процессе, известном как упаковка, компилятор может преобразовать типы значений в ссылочные типы. Дополнительные сведения см. в разделе Упаковка-преобразование и распаковка-преобразование.

Общие сведения о структурах

Структуры имеют следующие свойства.

  • Структуры являются типами значений, а классы — ссылочными типами.

  • В отличие то классов, структуры могут быть созданы без использования оператора new.

  • Структуры могут объявлять конструкторы, но эти конструкторы должны принимать параметры.

  • Структура не может наследовать от другой структуры или класса и не может быть основой класса. Все структуры наследуют непосредственно от System.ValueType, который наследует от System.Object.

  • Структуры могут реализовывать интерфейсы.

  • Структура может использоваться как тип, допускающий значение NULL, и ей можно назначить значение NULL.

Using Structs

The struct type is suitable for representing lightweight objects such as Point, Rectangle, and Color. Although it is possible to represent a point as a class, a struct is more efficient in some scenarios. For example, if you declare an array of 1000 Point objects, you will allocate additional memory for referencing each object; in this case, a struct would be less expensive. Since the .NET Framework contains an object called Point, we'll call our struct "CoOrds" instead.

public struct CoOrds

{

public int x, y;

public CoOrds(int p1, int p2)

{

x = p1;

y = p2;

}

}

It is an error to declare a default (parameterless) constructor for a struct. A default constructor is always provided to initialize the struct members to their default values. It is also an error to initialize an instance field in a struct.

When you create a struct object using the new operator, it gets created and the appropriate constructor is called. Unlike classes, structs can be instantiated without using the new operator. If you do not use new, the fields will remain unassigned and the object cannot be used until all of the fields are initialized.

There is no inheritance for structs as there is for classes. A struct cannot inherit from another struct or class, and it cannot be the base of a class. Structs, however, inherit from the base class Object . A struct can implement interfaces, and it does that exactly as classes do.

Unlike C++, you cannot declare a class using the keyword struct. In C#, classes and structs are semantically different. A struct is a value type, while a class is a reference type.

Unless you need reference-type semantics, small classes may be more efficiently handled by the system as a struct.