Как работать со структурами в C #

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

Когда экземпляр структуры передается методу, он всегда передается по значению. Это контрастирует с тем, что происходит, когда мы передаем экземпляр класса методу - экземпляр передается по ссылке.

Структуры программирования на C #

Вот как выглядит синтаксис объявления структуры.

struct

{

//Data members and member functions of the struct

}

The following code snippet shows how a typical struct definition looks like.

struct Rectangle

    {

        public int width;

        public int height;

    }

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

Rectangle rectangle = new Rectangle();

rectangle.width = 10;

rectangle.height = 15;

Приведенный выше фрагмент кода создает экземпляр структуры Rectangle и присваивает значения ее открытым членам. Обратите внимание, что внутри структуры могут быть как данные-члены, так и методы. Кроме того, вы можете указать участников как частные, общедоступные и внутренние. Следует отметить, что в отличие от классов у вас не может быть инициализаторов полей для нестатических полей в структурах. Следовательно, такие утверждения в структуре недопустимы.

int width = 10;

int height = 15;

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

static int area = 0;

Теперь давайте добавим в структуру несколько методов. Вот обновленная версия структуры Rectangle, которую мы создали ранее. Обратите внимание на использование параметризованного конструктора.

struct Rectangle

    {

        int width;

        int height;

        public Rectangle(int width, int height)

        {

            this.width = width;

            this.height = height;

        }

        public int GetArea()

        {

            return this.width * this.height;

        }

    }

Обратите внимание, что даже если структура не позволяет вам определить внутри нее явный конструктор без параметров, вы всегда можете иметь конструкторы параметров внутри структуры. Также, как и в классе, в структуре могут быть перегруженные конструкторы. Вот как вы можете установить значения с помощью конструктора структуры Rectangle, а затем получить область, вызвав метод GetArea (). Следует отметить, что, как и в классе, внутри структуры могут быть статические и нестатические методы.

static void Main(string[] args)

        {

            Rectangle rectangle = new Rectangle(10, 15);

            int area = rectangle.GetArea();

            Console.WriteLine("The area is: " + area.ToString());

            Console.Read();

        }

Как и класс, структура обеспечивает поддержку свойств и индексаторов. Одно из основных различий между структурой и классом заключается в том, что, в отличие от класса, структура не поддерживает наследование - у вас не может быть структуры, которая расширяет другой класс или структуру. Однако, подобно классу, структура может реализовывать интерфейс. Вот пример кода, который это иллюстрирует.

 interface IRectangle

    {

        int GetArea();

    }

  struct Rectangle : IRectangle

    {

        int width;

        int height;

        public Rectangle(int width, int height)

        {

            this.width = width;

            this.height = height;

        }

        public int GetArea()

        {

            return this.width * this.height;

        }

    }

Выбор между классом и структурой

Теперь мы подошли к интересному пункту обсуждения. Когда мы должны использовать структуру поверх класса и наоборот?

Как мы обсуждали ранее в этой статье, экземпляр структуры создается в стеке, а экземпляр класса создается в управляемой куче. Выделение и освобождение типов значений дешевле, чем ссылочные типы. Структура - хороший выбор, когда вам нужно создать составной тип данных, который будет содержать несколько членов данных. В идеале размер элементов данных структуры должен быть меньше 16 байт. Вы можете выбрать структуру, если хотите создать небольшую составную структуру данных, которая имеет семантику значений и содержит только несколько членов данных. Используя struct в таких случаях, вы можете избежать накладных расходов, связанных со сборкой мусора.

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