|
|
09. Struktury
|
|
Autor:
Paweł Kruczkowski
Opublikowano:
21 listopada 2006
Odsłon:
36478
»Skomentuj...
|
Strona:
|
 |
 |

Aby ten
błąd jak najszybciej poprawić musimy przypommieć sobie pojęcie właściwości. Jak
już doskonale wiemy właściwości pozwalają nam na hermetyzację danych i
deklarowanie ich jako prywatne. Ale – jak też pamiętamy – w rzeczywistości są
metodami składowymi, a wywołanie metody przed inicjalizacją zmiennych
składowych, których to te metody będą wykorzystywać jest procesem niedozwolonym
(o czym kompilator nas czym prędzej poinformuje, co widzimy powyżej). Tak więc,
aby powyższy błąd natychmiast poprawić, musimy również przypisać wszystkim
zmiennym składowym danej struktury odpowiednie wartości:
public struct Zwierzeta
{
public string zwierzak1;
public 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;
//przypisanie do zmiennych odpowiednich wartosci, w naszym
przypadku bedzie to pusty string
z.zwierzak1 = "";
z.zwierzak2 = "";
//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);
}
}
Teraz nasz
program skompiluje się bez żadnych przeszkód i otrzymamy prawidłowe wyniki,
mimo że zadeklarowaliśmy strukturę bez słowa kluczowego: new.
Aktualna ocena to: 4,29
Tagi:
|
Komentarze do 09. Struktury
ja
26 maja 2008,
14:36
tyle co umiałem to zrozumiałem - po co ta zabawa z tym ToString()
camillos
16 lipca 2008,
10:25
Ja nie wiem po co w metodzie ToString() tak dziwnie piszą: String.Format("coś tam") Po co to w ogóle jest?
KA
9 listopada 2008,
21:44
Co do kwestii merytorycznej artykułu, niestety w kodzie jest błąd, nie został on uaktualniony o ptaki.
Co do ToString() jest to funkcja, która w klasie/strukturze Zwierzęta w sposób specjalny formatuje przekazane argumenty np. "arg1" i "arg2" będzie "arg1 oraz arg2". Metoda ToString() jest zawsze wywoływana, gdy chcemy coś wyświetlić na konosoli, dlatego nie trzeba dopisywać słowa "oraz".
loop
18 stycznia 2010,
15:24
mogły by być nazwy właściwości parametry w konstruktorze i agrument w strukturze ponazywane w bardziej różniący się sposób poniewarz zwierzak1, zwierzak1 i Zwierzak1 troche jest uciążliwe w czytaniu i zrozumieniu co jest co, poprostu mało czytelne
janf
5 sierpnia 2011,
14:11
Cytuję> "Efekt mamy pożądany, ale dlaczego właśnie w taki sposób go otrzymaliśmy? Odpowiedź jest prosta: struktura została przekazana jako typ skalarny, dlatego też metoda MojaMetoda() operuje na kopiach a nie na oryginalnych obiektach." < Koniec cytatu.
To jest BŁĘDNE WYJAŚNIENIE!
MojaMetoda, zgodnie z deklaracją, pobrała lokalnie wartości elementów struktury z funkcji wywołującej, wykorzystała przy tym tę samą strukturę (identycznie ją nazywając), jako lokalny "schowek", po czym, NADZYCZAJNIEJ W ŚWIECIE N A D P I S A Ł A elementy struktury lokalnej i wyświetliła je!
Pietro wyżej obiekt "z" użyty w wywołaniu MojejMetody ma swoje wartości elementów, które się nie zmieniły i one sa wyświetlane.
Dodaj swój komentarz