Jak pracować ze strukturami w C #

Chociaż istnieje wiele podobieństw między klasą a strukturą, istnieją również wyraźne różnice. Co najważniejsze, struktura w przeciwieństwie do klasy jest typem wartości. Tak więc, podczas gdy instancje klasy są przechowywane w stercie, instancje struktury są przechowywane na stosie.

Gdy instancja struktury jest przekazywana do metody, jest zawsze przekazywana przez wartość. W przeciwieństwie do tego, co dzieje się, gdy przekazujemy instancję klasy do metody - instancja jest przekazywana przez odwołanie.

Programowanie struktur w C #

Oto jak wygląda składnia deklarowania struktury.

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;

    }

Możesz teraz przypisać wartości członkom struktury, którą zdefiniowałeś wcześniej, jak pokazano w poniższym fragmencie kodu.

Rectangle rectangle = new Rectangle();

rectangle.width = 10;

rectangle.height = 15;

Powyższy fragment kodu tworzy instancję struktury Rectangle i przypisuje wartości jej publicznym członkom. Zauważ, że możesz mieć zarówno dane składowe, jak i metody wewnątrz struktury. Możesz także określić członków jako prywatnych, publicznych i wewnętrznych. Należy zauważyć, że w przeciwieństwie do klas nie można mieć inicjatorów pól dla pól niestatycznych w strukturach. W związku z tym instrukcje w strukturze, takie jak poniższe, są nieprawidłowe.

int width = 10;

int height = 15;

Mimo to możesz zainicjować statyczne elementy członkowskie w swoich strukturach. Stąd następujące jest prawidłowe oświadczenie wewnątrz struktury.

static int area = 0;

Dodajmy teraz kilka metod do struktury. Oto zaktualizowana wersja struktury Rectangle, którą utworzyliśmy wcześniej. Zwróć uwagę na użycie sparametryzowanego konstruktora.

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;

        }

    }

Zauważ, że nawet jeśli struktura nie pozwala na zdefiniowanie w niej jawnego konstruktora bez parametrów, zawsze możesz mieć konstruktory parametrów wewnątrz struktury. Podobnie jak w przypadku klasy, możesz mieć również przeciążone konstruktory w strukturze. Oto jak można ustawić wartości za pomocą konstruktora struktury Rectangle, a następnie uzyskać obszar, wywołując metodę GetArea (). Należy zauważyć, że podobnie jak w przypadku klasy, w strukturze można mieć metody statyczne i niestatyczne.

static void Main(string[] args)

        {

            Rectangle rectangle = new Rectangle(10, 15);

            int area = rectangle.GetArea();

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

            Console.Read();

        }

Podobnie jak klasa, struktura zapewnia obsługę właściwości i indeksatorów. Jedną z głównych różnic między strukturą a klasą jest to, że w przeciwieństwie do klasy, struktura nie obsługuje dziedziczenia - nie można mieć struktury, która rozszerza inną klasę lub strukturę. Jednak podobnie do klasy struktura może implementować interfejs. Oto przykład kodu, który to ilustruje.

 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;

        }

    }

Wybór między klasą a strukturą

Teraz dochodzimy do interesującego punktu debaty. Kiedy powinniśmy używać struktury zamiast klasy i odwrotnie?

Jak omówiliśmy wcześniej w tym artykule, wystąpienie struktury jest tworzone na stosie, podczas gdy wystąpienie klasy jest tworzone na stercie zarządzanym. Alokacja i cofanie alokacji typów wartości są tańsze niż typy referencyjne. Struktura to dobry wybór, gdy trzeba utworzyć złożony typ danych, który pomieści kilka elementów członkowskich danych. W idealnym przypadku rozmiar elementów członkowskich danych struktury powinien być mniejszy niż 16 bajtów. Możesz wybrać strukturę, jeśli chcesz zbudować małą złożoną strukturę danych, która ma semantykę wartości i zawiera tylko kilka elementów członkowskich danych. Używając struct w takich przypadkach, możesz uniknąć narzutu związanego z wyrzucaniem elementów bezużytecznych.

Podczas pracy ze strukturami należy postępować zgodnie z zalecanymi najlepszymi praktykami. Należy unikać używania struktury, która ma większy rozmiar niż jest to zalecane w tym artykule. Należy również zauważyć, że przekazywanie wystąpień struktur do metod jest bardziej kosztowne pod względem wydajności niż przekazywanie wystąpień klas. Podczas pracy z małymi strukturami danych zaleca się używanie struktur. Więcej informacji na ten temat można znaleźć w tym artykule MSDN.