Programování

Jak pracovat se strukturami v C #

I když existuje spousta podobností mezi třídou a strukturou, existují také některé odlišné rozdíly. A co je nejdůležitější, struktura na rozdíl od třídy je typ hodnoty. Takže zatímco instance třídy jsou uloženy v haldě, instance struktury jsou uloženy v zásobníku.

Když je instance struktury předána metodě, je vždy předána hodnotou. To je v kontrastu s tím, co se stane, když předáme instanci třídy metodě - instance je předána odkazem.

Programování struktur v C #

Takto vypadá syntaxe pro deklarování struktury.

struktur

{

// Datové členy a členské funkce struktury

}

Následující fragment kódu ukazuje, jak vypadá definice typické struktury.

strukturovaný obdélník

    {

public int šířka;

veřejná int výška;

    }

Nyní můžete přiřadit hodnoty členům struktury, kterou jste definovali dříve, jak je ukázáno v fragmentu kódu níže.

Obdélník obdélník = nový Obdélník ();

obdélník. šířka = 10;

výška obdélníku = 15;

Výše uvedený fragment kódu vytvoří instanci struktury Rectangle a přiřadí hodnoty jejím veřejným členům. Všimněte si, že uvnitř struktury můžete mít jak členská data, tak metody. Můžete také určit členy jako soukromé, veřejné a interní. Je třeba poznamenat, že na rozdíl od tříd nemůžete mít inicializátory polí pro nestatické pole ve strukturách. Proto příkazy jako následující ve struktuře nejsou platné.

int šířka = 10;

int výška = 15;

Ve svých strukturách můžete inicializovat statické členy. Proto je následující platné prohlášení uvnitř struktury.

statická int plocha = 0;

Pojďme nyní do struktury přidat několik metod. Tady je aktualizovaná verze struktury Obdélník, kterou jsme vytvořili dříve. Všimněte si použití konstruktoru s parametry.

strukturovaný obdélník

    {

int šířka;

výška int;

veřejný obdélník (int šířka, int výška)

        {

this.width = width;

this.height = výška;

        }

public int GetArea ()

        {

vrátit this.width * this.height;

        }

    }

Všimněte si, že i když vám struktura neumožňuje definovat v ní explicitní konstruktor bez parametrů, vždy můžete mít konstruktory parametrů uvnitř struktury. Podobně jako ve třídě můžete mít přetížené konstruktory také ve struktuře. Zde je ukázka, jak můžete nastavit hodnoty pomocí konstruktoru Rectangle struktury a poté získat oblast vyvoláním metody GetArea (). Je třeba poznamenat, že podobně jako ve třídě můžete mít uvnitř struktury statické a nestatické metody.

static void Main (řetězec [] args)

        {

Obdélník obdélník = nový obdélník (10, 15);

int area = rectangle.GetArea ();

Console.WriteLine ("Oblast je:" + area.ToString ());

Console.Read ();

        }

Stejně jako třída poskytuje struktura podporu pro vlastnosti a indexery. Jedním z hlavních rozdílů mezi strukturou a třídou je, že na rozdíl od třídy struktura nepodporuje dědičnost - nemůžete mít strukturu, která rozšiřuje jinou třídu nebo strukturu. Podobně jako třída však struktura může implementovat rozhraní. Tady je příklad kódu, který to ilustruje.

rozhraní IRectangle

    {

int GetArea ();

    }

struct Rectangle: IRectangle

    {

int šířka;

výška int;

veřejný obdélník (int šířka, int výška)

        {

this.width = width;

this.height = výška;

        }

public int GetArea ()

        {

vrátit this.width * this.height;

        }

    }

Volba mezi třídou a strukturou

Nyní se dostáváme k zajímavému bodu debaty. Kdy bychom měli použít strukturu nad třídou a naopak?

Jak jsme diskutovali dříve v tomto článku, v zásobníku se vytvoří instance struktury, zatímco ve spravované haldě se vytvoří instance třídy.As we mentioned earlier in this article, an instance of a struct is created in the stack while an instance of a class is created in the managed heap. Alokace a deallocation typů hodnot jsou levnější než referenční typy. Struktura je dobrá volba, když potřebujete vytvořit složený datový typ, který by obsahoval několik datových členů. V ideálním případě by velikost datových členů struktury měla být menší než 16 bajtů. Můžete se rozhodnout pro strukturu, když chcete vytvořit malou kompozitní datovou strukturu, která má sémantiku hodnot a obsahuje pouze několik datových členů. Při použití struktury v takových případech se můžete vyhnout režii spojené s uvolňováním paměti.

Při práci se strukturami byste měli dodržovat doporučené osvědčené postupy. Měli byste se vyhnout použití struktury, která má větší velikost, než je doporučeno v tomto článku. Všimněte si také, že předávání instancí struktur do metod je nákladnější z hlediska výkonu než předávání instancí tříd. Při práci s malými datovými strukturami je vhodné používat struktury. Více o tomto tématu se dozvíte z tohoto článku MSDN.

$config[zx-auto] not found$config[zx-overlay] not found