Структура | Structure

Основные моменты

Структура в C# - это конструкция языка, состоящая из ключевого слова struct, идентификатора и тела. Структура может содержать в своем теле поля, свойства и методы. Также структуры могут включать в свое тело другие структуры и классы, но такой подход не является широко распространённой техникой.

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

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

Создаем структуру Book:

struct Book
{
    public string name;
    public string author;
    public int year;
}

Используем структуру на практике:

class Program
    {
        static void Main(string[] args)
        {
            Book book;
            book.name = "Война и мир";
            book.author = "Л. Н. Толстой";
            book.year = 1869;
        }
    }

Особенности:

  1. В структуре нельзя задавать явно конструктор по умолчанию.
  2. В структуре нельзя инициализировать поля в месте их создания.
  3. В пользовательском конструкторе должны быть инициализированы все поля структуры.
  4. Структура может содержать static члены, но сама не может быть статической.
  5. Статический конструктор вызывается только при вызове пользовательского. При вызове конструктора по умолчанию, статический конструктор не вызывается.
  6. Структура не поддерживает наследование. Исключением является реализация интерфейсов и неявное наследование от ValueType.
  7. При копировании структуры создаётся отдельная копия, которая после копирования живёт «своей жизнью» (в классах — создаётся ссылка на тот же экземпляр).
  8. Передача параметров: как локальные копии переменных (в классах — как ссылки).
  9. Освобождение переменной: при выходе за пределы видимости (в классах — во время процесса сборки мусора).

Особенности работы с памятью

При создании структуры в методе, она хранится в стековой памяти. В таком случае структура является локальной переменной.

MyStruct struct = new MyStruct();

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

MyStruct[] array = new MyStruct[42];

Также возможно в течении хода программы менять место хранения структуры, и переносить ее либо в управляемую кучу, либо в стек. (Подробнее: Упаковка\Распаковка | Boxing\Unboxing)

Если экземпляр структуры является member'ом класса, он всегда храниться в куче.

Resources
[Структуры С# \ Metanit.com](https://metanit.com/sharp/tutorial/2.13.php)
О вреде изменяемых значимых типов - http://sergeyteplyakov.blogspot.com/2011/07/blog-post.html

results for ""

    No results matching ""