Как да работя със структури в 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.