none
Рекурсивные ссылки между классами и структурами RRS feed

Ответы

  • Всё просто.

    Структуры в .NET являются значимыми типами, то есть хранятся непосредственно их значения. При попытке объявить две структуры как в примере по ссылке:

    struct RecursiveLayoutStruct1
    {
       public RecursiveLayoutStruct2 field;
    }
    
    struct RecursiveLayoutStruct2
    {
       public RecursiveLayoutStruct1 field;   // CS0523
    }

    Компилятор должен выделить память для всех полей первой структуры, в том числе и для вложенной в него второй структуры. А внутри второй снова имеется первая - то есть нужно опять для неё память выделить. И так бесконечно.

    Причём происходит это на этапе компиляции.


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

    Конечно, вручную можно написать код, который и в классах будет рекурсивно создавать всё новые экземпляры классов, что приведёт к переполнению памяти. Но это будет происходить уже на этапе выполнения (в рантайме).


    18 апреля 2016 г. 14:20