• Добро пожаловать на сайт - Forumteam.digital !

    Что бы просматривать темы форума необходимо зарегестрироваться или войти в свой аккаунт.

    Группа в телеграме (подпишитесь, что бы не потерять нас) - ForumTeam Chat [Подписатся]
    Связь с администратором - @ftmadmin

15. Кое-что о структурах.

Redman

<FORUMTEAM>
Команда форума
Регистрация
13.11.17
Сообщения
13.340
Реакции
8.377
Баллы
1.200
FTC
208¢
Структуры.

В отличие от классов и структур в 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
    }
}

******
Структура не может иметь деструктор.

******
 
Сверху Снизу