CentrumXP.pl » Witamy
CentrumXP.pl
 
Szukaj
Subskrypcja
Powiadomienie e-mailem o nowościach na CentrumXP.pl:
E-mail: Zapisz
Czy zamierzasz pobrać Internet Explorer 9?


CentrumXP.pl » Microsoft .NET » Kurs C#, cz. II » Dodaj do ulubionych Dodaj do ulubionych   Dodaj do ulubionych Wersja do wydruku

09. Struktury

Autor: Paweł Kruczkowski    Opublikowano: 21 listopada 2006    Odsłon: 36477    »Skomentuj...
Strona:
Zobacz również:

01. Zmienne, stałe, wyrażenia i odstępy w C# 2.0

02. Usuwanie obiektów

03. Przekazywanie parametrów

04. Przeciążanie metod i konstruktorów

05. Hermetyzacja danych

06. Dziedziczenie i polimorfizm

07. Abstrakcja w C#

08. Porozmawiajmy o klasach

10. Interfejsy, część 1

11. Interfejsy, część 2

12. Słowniki w C# 2.0

13. Łańcuchy w C# 2.0

14. Wyrażenia regularne

15. Wyjątki - część I

16. Wyjątki - część II

17. Delegaty i zdarzenia

18. Operacje wejścia - wyjścia cz.1

19. Operacje wejścia - wyjścia cz. 2

20. Atrybuty i mechanizm refleksji

»Uzyskaj pomoc na forum

                        Zwierzeta z = new Zwierzeta("kot", "kuna");

Powyższy nowy egzemplarz „z” w konstruktorze otrzymuje 2 wartości: „kot” oraz „kuna”.

Po skompilowaniu powyższego programu otrzymamy następujące wyniki:

Jak już wiemy, struktury są typami skalarnymi. Oznacza to po prostu, że gdy przekazuje się je do funkcji, to przekazuje się je poprzez wartość. W powyższym kodzie obiekt „z” przekazywany jest do metody: MojaMetoda() poprzez właśnie wartość (obiekt „z” jest przecież typu struktury Zwierzeta). W metodzie tej składowym: Zwierzak1 oraz Zwierzak2 przypisywana jest nowa wartość, która zostaje następnie wyświetlona („Moje ulubione zwierzaki to: pies oraz gołąb”). Jednak po powrocie do metody Main() w klasie głównej i ponownym wywołaniu metody WriteLine() na obiekcie „z” możemy zauważyć, że wartości te nie zostały zmienione na stałe („Nie jest fajny: kot oraz kuna”). 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.

Spróbujmy teraz sprawdzić powyższą tezę i zamiast inicjalizacji struktury utwórzmy klasę Zwierzeta. Nasz program będzie wyglądał w następujący sposób:

public class 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);
    }
}

Gdy teraz uruchomimy powyższy program, to otrzymamy inne wyniki niż poprzednio:


«Wstecz 1 2 3 4 5 Dalej» 

Aktualna ocena to: 4,29

Oceń artykuł...
Porażka Kiepski Taki Sobie Dobry Super!

Tagi:  

A teraz:    Dodaj do ulubionych Dodaj do ulubionych    Wydrukuj Wydrukuj    Wyślij link znajomemu Wyślij link znajomemu    Skomentuj Skomentuj

Komentarze do 09. Struktury

Dodaj komentarz»

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

»Zasady udzielania komentarzy

Autor:  
Komentarz:
Dodaj komentarz
© 2012 Onex Group
Onex Group O Onex Group  |  O CentrumXP.pl  |  Kontakt  |  Reklama
Nasze serwisy: CentrumXP.plXboxSpot.pl  |  Jama Mastaha