
>Tym razem program traktuje obiekt „z” jako typ referencyjny.
Dlatego też metoda MojaMetoda()
operuje teraz na oryginalnych wartościach a nie na kopiach obiektów (zmiany
jakie nastąpią dzięki metodzie MojaMetoda()
będą również dotyczyć oryginalnego obiektu w metodzie Main()).
Podsumowując, struktura to alternatywa dla klasy, której
niestety nie możemy dziedziczyć. Innymi słowy, struktura jest zamknięta dla
innych struktur oraz dla wszystkich innych klas. Struktury niejawnie dziedziczą
po klasie Object, którą doskonale już znamy.
Ważną różnicą jest również to, że w strukturze nie można
bezpośrednio inicjalizować pól np.:
private string zwierzak1 = "pies";
private string zwierzak2 = "kot";
jest
dozwolone w klasie, a w strukturze jest już kodem niepoprawnym. Ostatnią
różnicą, o której warto wspomnieć jest to, że struktury nie mogą zawierać
domyślnego konstruktora bez parametrów, a także destruktora. Gdybyśmy w
powyższym programie nie zainicjalizowali publicznego konstruktora Zwierzeta (przyjmąjącego 2 parametry
typu string) to kompilator zainicjalizowałby tę strukturę poprzez przypisanie
domyślnych wartości wszystkim jej składowym (zwierzak1 oraz zwierzak2).
Na koniec
chciałbym napisać parę słów na temat tworzenia struktur bez słowa kluczowego new. Oczywiście jest to dozwolone i tak
stworzona struktura jest jak najbardziej prawidłowa, ponieważ jest to zgodne z
definicją typów wbudowanych. Spróbujmy więc dobrze już nam znany przykład
napisać tak, aby struktura w nim nie była stworzona za pomocą słowa kluczowego new. W tym celu w metodzie Main() zdefiniujmy strukturę „z” bez
słowa kluczowego new w następujący
sposób:
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()
{
//definiujemy
strukture bez wywolania konstruktora
Zwierzeta
z;
//uzywamy
wlasciwosci
z.Zwierzak1 = "kot";
z.Zwierzak2 = "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);
}
}
Tak
napisany przez nas program wyświetli prawidłowe wyniki. Niemniej jednak
kompilator w czasie kompilacji zgłosi mniej więcej nastepujący błąd: