Tematem
dzisiejszego artykułu będą struktury, które są prostym typem definiowanym i
często używanym przez programistów. Nauczymy się je prawidłowo definiować i
deklarować, a także opowiemy sobie o różnicach występujących między nimi a klasami.
Struktury
są bardzo podobne do klas, ponieważ reprezentują pewne struktury danych, które
zawierają dane składowe oraz składowe funkcyjne. Innymi słowy, struktura to
alternatywa dla klasy, może bowiem zawierać
konstruktory, właściwości, metody, pola a nawet typy zagnieżdżone. Jednak w
przeciwieństwie do klas, struktur nie możemy dziedziczyć. W strukturach również
nie można używać destruktorów. Trzecią istotną różnicę między strukturą a klasą stanowi to, że
ta pierwsza jest typem skalarnym, a druga – typem referencyjnym (o typach
skalarnych i referencyjnych pisaliśmy na łamach portalu CentrumXP przy okazji
omawiania sposobu przekazywania parametrów w języku C# 2.0).
Ta trzecia
różnica ma ogromne znaczenie. Dzisiaj bowiem znamy
różnicę między typami referencyjnymi a skalarami, dlatego też fakt, że
struktury powinniśmy używać jedynie w przypadku małych i prostych typów nie
jest dla nas żadnym zaskoczeniem. Mówiąc inaczej, struktury są przydatne do
reprezentowania obiektów, które nie wymagają współpracy z typami
referencyjnymi.
Struktury
definiujemy niemal identycznie jak klasy:
[atrybuty] [modyfikatory dostępu] struct identyfikator [:interfejsy]
{
składowe struktury
}
Do
definicji struktur używamy słowa kluczowego: struct. Jedyną dla nas nowością w powyższym zapisie jest pojęcie
interfejsów. Są one pewną alternatywą dla klas abstrakcyjnych (za tydzień
opowiemy sobie szerzej o interfejsach).
Tymczasem napiszmy
pierwszy program, w którym zdefiniujemy i użyjemy strukturę:
public struct Zwierzeta
{
private string zwierzak1;
private string zwierzak2;
public
Zwierzeta(string zwierzak1, string zwierzak2)
{
this.zwierzak1
= zwierzak1;
this.zwierzak2
= zwierzak2;
}
public string Zwierzak1
{
get { return zwierzak1; }
set {
zwierzak1 = value; }
}
public string Zwierzak2
{
get { return zwierzak2; }
set {
zwierzak2 = value; }
}
public override string ToString()
{
return (String.Format("{0} oraz {1}", zwierzak1, zwierzak2));
}
}
public class MojeZwierzeta
{
public void MojaMetoda(Zwierzeta
z)
{
z.Zwierzak1 = "pies";
z.Zwierzak2 = "gołąb";
System.Console.WriteLine("Moje ulubione zwierzaki to: {0}.", z);
}
}
class Glowna
{
static void Main()
{
Zwierzeta
z = new Zwierzeta("kot", "kuna");
System.Console.WriteLine("Nie lubię takich zwierzaków jak: {0}.",
z);
MojeZwierzeta
mz = new MojeZwierzeta();
mz.MojaMetoda(z);
System.Console.WriteLine("Nie jest fajny: {0}.", z);
}
}
Podobnie jak w przypadku klasy, aby stworzyć egzemplarz
struktury należy użyć słowa kluczowego new: