Werken met structs in C #

Hoewel er veel overeenkomsten zijn tussen een klasse en een structuur, zijn er ook enkele duidelijke verschillen. Het belangrijkste is dat een struct, in tegenstelling tot een klasse, een waardetype is. Dus, terwijl instanties van een klasse in de heap worden opgeslagen, worden instanties van een struct in de stapel opgeslagen.

Wanneer een instantie van een struct wordt doorgegeven aan een methode, wordt deze altijd op waarde doorgegeven. Dit is in tegenstelling tot wat er gebeurt als we een instantie van een klasse doorgeven aan een methode - de instantie wordt door middel van verwijzing doorgegeven.

Structuren programmeren in C #

Hier is hoe de syntaxis voor het declareren van een struct eruit ziet.

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;

    }

U kunt nu waarden toewijzen aan de leden van de structuur die u eerder hebt gedefinieerd, zoals weergegeven in het onderstaande codefragment.

Rectangle rectangle = new Rectangle();

rectangle.width = 10;

rectangle.height = 15;

Het bovenstaande codefragment maakt een instantie van de Rectangle-structuur en wijst waarden toe aan de openbare leden ervan. Merk op dat u zowel lidgegevens als methoden binnen een struct kunt hebben. U kunt de leden ook specificeren als privé, openbaar en intern. Opgemerkt moet worden dat u, in tegenstelling tot klassen, geen veldinitialisatieprogramma's kunt hebben voor niet-statische velden in structs. Daarom zijn uitspraken zoals de volgende in een struct niet geldig.

int width = 10;

int height = 15;

U kunt hoe dan ook statische leden in uw structs initialiseren. Daarom is het volgende een geldige verklaring binnen een struct.

static int area = 0;

Laten we nu een paar methoden aan de struct toevoegen. Hier is de bijgewerkte versie van de Rectangle-structuur die we eerder hebben gemaakt. Let op het gebruik van de geparametriseerde constructor.

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;

        }

    }

Merk op dat zelfs als een struct je niet toestaat om een ​​expliciete parameterloze constructor erin te definiëren, je altijd parameterconstructors binnen een struct kunt hebben. Net als bij een klasse, kunt u ook overbelaste constructors in een struct hebben. Hier leest u hoe u waarden kunt instellen met behulp van de constructor van de Rectangle-structuur en vervolgens het gebied kunt ophalen door de GetArea () -methode aan te roepen. Opgemerkt moet worden dat u, net als bij een klasse, statische en niet-statische methoden binnen een struct kunt hebben.

static void Main(string[] args)

        {

            Rectangle rectangle = new Rectangle(10, 15);

            int area = rectangle.GetArea();

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

            Console.Read();

        }

Net als een klasse biedt een struct ondersteuning voor eigenschappen en indexeerders. Een groot verschil tussen een struct en een class is dat, in tegenstelling tot een class, een struct geen overerving ondersteunt - je kunt geen struct hebben die een andere class of struct uitbreidt. Echter, vergelijkbaar met een klasse, kan een struct een interface implementeren. Hier is een codevoorbeeld dat dit illustreert.

 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;

        }

    }

Kiezen tussen een klasse en een struct

Nu komen we bij een interessant punt van discussie. Wanneer moeten we een struct gebruiken boven een klasse en omgekeerd?

Zoals we eerder in dit artikel hebben besproken, wordt een instantie van een struct gemaakt in de stapel terwijl een instantie van een klasse wordt gemaakt in de beheerde heap. Toewijzing en ongedaan maken van de toewijzing van waardetypen zijn goedkoper dan referentietypes. Een struct is een goede keuze wanneer u een samengesteld gegevenstype moet maken dat een paar gegevensleden zou bevatten. Idealiter zou de grootte van de gegevensleden van een struct minder dan 16 bytes moeten zijn. U kunt kiezen voor een structuur als u een kleine samengestelde datastructuur wilt bouwen die waardenemantiek heeft en slechts een paar gegevensleden bevat. Door in dergelijke gevallen struct te gebruiken, kunt u de overhead vermijden die gepaard gaat met garbage collection.

U moet de aanbevolen best practices volgen bij het werken met structs. U moet het gebruik van een structuur vermijden die groter is dan wat in dit artikel wordt aanbevolen. Merk ook op dat het doorgeven van instanties van structs aan methoden duurder is in termen van prestaties dan het passeren van instanties van klassen. Het is raadzaam om structs te gebruiken wanneer u met kleine datastructuren werkt. U kunt meer over dit onderwerp lezen in dit MSDN-artikel.