- Автор темы
- #1
Структуры.
В отличие от классов и структур в C++, структуры C# семантически отличны от классов. В данном разделе будет освещен ряд таких отличий (Некоторые отличия будут указаны в последующих уроках).
Структурный тип
Основное отличие заключается в том, что структуры являются структурными типами (value types). Напоминаем, что объекты ссылочных типов создаются в куче, а объекты структурного типа создаются в стеке. Это означает, что при копировании двух объектов структур друг другу, вы получите не две ссылки на одно значение (случай для объектов классов), а два независимых объекта с одинаковым содержимым.
Объект структурного типа может присваиваться объекту типа object. В этом случае в куче создается временный объект, иммитирующий поведение ссылочного. В этот временный объект копируются данные из структурного, а сам объект помечается специальной отметкой о содержащемся в нем типе, чтобы тип объекта был известен среде. Этот процесс называется упаковкой (boxing), обратный процесс называется распаковкой (unboxing).
Поля и методы структур
Поля (нестатические) структур не могут инициализироваться при объявлении.
Для структур запрещено объявление конструктора по умолчанию (его предоставляет среда).
Объекты структур можно создавать без использования оператора new, хотя при попытке его немедленного использования компилятор сообщит, что такое-то поле объекта неплохо бы проинициализировать.
******
Структура не может иметь деструктор.
******
В отличие от классов и структур в C++, структуры C# семантически отличны от классов. В данном разделе будет освещен ряд таких отличий (Некоторые отличия будут указаны в последующих уроках).
Структурный тип
Основное отличие заключается в том, что структуры являются структурными типами (value types). Напоминаем, что объекты ссылочных типов создаются в куче, а объекты структурного типа создаются в стеке. Это означает, что при копировании двух объектов структур друг другу, вы получите не две ссылки на одно значение (случай для объектов классов), а два независимых объекта с одинаковым содержимым.
Код:
struct S
{
public int i;
public S(int n)
{
i = n;
}
}
class MainClass
{
static void Main()
{
S str = new S(76);
Console.WriteLine(str.i); // 76
S str1 = str; // копируем объект
str1.i = 77;
Console.WriteLine(str.i); // 76
Console.WriteLine(str1.i); // 77
}
}
Объект структурного типа может присваиваться объекту типа object. В этом случае в куче создается временный объект, иммитирующий поведение ссылочного. В этот временный объект копируются данные из структурного, а сам объект помечается специальной отметкой о содержащемся в нем типе, чтобы тип объекта был известен среде. Этот процесс называется упаковкой (boxing), обратный процесс называется распаковкой (unboxing).
Код:
int i1 = 111;
object obj = i1; // упаковка int в object
int i2 = (int) obj; // распаковка object в int (необходимо приводиться)
Поля и методы структур
Поля (нестатические) структур не могут инициализироваться при объявлении.
Код:
struct S
{
public int i = 0; // Ошибка
}
Для структур запрещено объявление конструктора по умолчанию (его предоставляет среда).
Код:
struct S
{
public int i;
public S(int n)
{
i = n;
}
public S() // Ошибка
{
i = 0;
}
}
Объекты структур можно создавать без использования оператора new, хотя при попытке его немедленного использования компилятор сообщит, что такое-то поле объекта неплохо бы проинициализировать.
Код:
struct S
{
public int i;
public S(int n)
{
i = n;
}
}
class MainClass
{
static void Main()
{
S str;
// Console.WriteLine(str.i); - Ошибка, поле i не проинициализировано
str.i = 77;
Console.WriteLine(str.i); // 77
S str1 = new S();// Вызывается системный конструктор по умолчанию
Console.WriteLine(str1.i); // 0
}
}
******
Структура не может иметь деструктор.
******