CentrumXP.pl » Witamy
CentrumXP.pl
 
22 października 2009 - Premiera Microsoft Windows 7 - dowiedź się więcej w Portalu CentrumXP.pl...
Szukaj
Subskrypcja
Powiadomienie e-mailem o nowościach na CentrumXP.pl:
E-mail: Zapisz
Czy byłbyś zainteresowany mobilną wersją Portalu CentrumXP.mobi dla komórek?

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

10. Typy proste i referencyjne

Autor: Daniel Celeda    Opublikowano: 31 stycznia 2006    Odsłon: 69023    »Skomentuj...
Strona:
Zobacz również:

01. "Programowanie" - z czym to się je?

02. Programowanie obiektowe

03. Do czego potrzebne jest nam Visual Studio 2005

04. Konfiguracja i obsługa C# 2005 Express Edition

05. Tworzenie solution i nowych projektów

06. Klasy i obiekty

07. Tworzenie oraz inicjalizacja obiektów

08. Operatory arytmetyczne

09. Porozmawiajmy o „stringach”

11. Wartości logiczne

12. Inne operatory logiczne

13. Instrukcje iteracyjne (tzw. pętle) - cz. I

14. Instrukcje iteracyjne (tzw. pętle) - cz. II

15. Tablice

16. Kolekcje

17. Typy generyczne (generics)

18. Przestrzenie nazw (namespaces)

19. Modyfikatory dostępu

20. Metody statyczne oraz metody instancyjne

»Uzyskaj pomoc na forum

W C#, tak jak w innych językach obiektowych, mamy typy proste i referencyjne.

Do typów prostych należą dane liczbowe takie jak: „int”, „float”, itd., a także typy wyliczeniowe oraz struktury („string” to struktura, a więc jest typem prostym). Przypisując do jednej zmiennej prostej jakąś wartość lub wartość z innej zmiennej prostej, tworzy się kopia.  W  przypadku referencji nie powstaje kopia danych, lecz kopiuje się tzw. wskaźnik na dane, czyli wskazanie na jakie dane zmienna wskazuje. Spróbuję to zobrazować przykładami.

Najpierw przyjrzyjmy się operacjom na typach prostych.

class KlasaGlowna
{
    static void Main()
    {
        int x = 2;
        int y = x;
        x = x + 8;

        System.Console.WriteLine("Wartość x: " + x);
        System.Console.WriteLine("Wartość y: " + y);
        System.Console.ReadLine();
    }
}

Na początku przypisujemy wartość 2 do zmiennej “x”, następnie kopię wartości “x” (w zasadzie wartości 2 znajdującej się w zmiennej “x”) zmiennej “y”. Na koniec zwiększamy wartość zmiennej „x” o 8 i wypisujemy zawartości obu zmiennych na ekranie.

Widać, że zmiana wartości zmiennej „x” nie miała wpływu na wartość zmiennej „y”.
Zupełnie inaczej jest w przypadku zmiennych referencyjnych.

class KlasaPomocnicza
{
    public int x;
}
class KlasaGlowna
{
    static void Main()
    {
        KlasaPomocnicza obiekt1 = new KlasaPomocnicza();
        KlasaPomocnicza obiekt2 = new KlasaPomocnicza();

        obiekt1.x = 2;
        obiekt2 = obiekt1;
        obiekt1.x = obiekt1.x + 8;

        System.Console.WriteLine("Wartość x w obiekcie pierwszym: " + obiekt1.x);
        System.Console.WriteLine("Wartość x w obiekcie drugim: " + obiekt2.x);
        System.Console.ReadLine();
    }
}

Wynik wykonania powyższego programu może być zaskakujący.

Zwiększaliśmy wartość „x” tylko w obiekcie pierwszym, jednak zwiększyła się też wartość „x” w obiekcie drugim. Stało się tak dlatego, ponieważ obiekty to typy referencyjne. W linijce

obiekt2 = obiekt1;

określiliśmy, że obydwa obiekty wskazują na to samo miejsce w pamięci, a więc każda zmiana danych wskazywanych przez jeden z obiektów, powoduje zmianę danych wskazywanych przez drugi (jest to oczywistem, ponieważ są to te same dane).


1 2 3 Dalej» 

Aktualna ocena to: 4.08

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 10. Typy proste i referencyjne

Dodaj komentarz»

Shreeve 27 lipca 2006, 7:54

Kod działa, ale zastanawia mnie, w jaki sposób mamy dostęp do zmiennych klasy, bez tworzenia jej instancji, lub bez oznaczania jej jako static, tym bardziej, że jest dostęp poprzez nazwę klasy?

nj 29 lipca 2006, 11:40

@Shreeve: "KlasaPomocnicza obiekt1 = new KlasaPomocnicza(); KlasaPomocnicza obiekt2 = new KlasaPomocnicza();" Te linie tworzą dwie nowe instancje klasy KlasaPomocnicza: obiekt1 i obiekt2... Dzięki temu, że zmienna x NIE jest statyczna, każda instancja przechowuje swoją wartość iksa, do którego dostęp mamy przez nazwę instancji, np. obiekt1.x - mam nadzieję, że rozjaśniłem. Pozdrawiam :)

Wujek 5 sierpnia 2006, 20:48

Błąd w kodzie; pierwsze okno int x = 2; int y = x; x = x + 8; powinno być: int x = 2; int y = x; y = x + 8;

Ciocia 10 sierpnia 2006, 12:38

Sam jestes błąd w kodzie

Wujek 10 sierpnia 2006, 17:01

Ty ciotka nie podskakuj bo ci zaraz zrobie masowanie jąder

kostii 11 sierpnia 2006, 11:56

nie błąd w kodzie tylko źle zrozumiałes lekcje

Kazik 14 sierpnia 2006, 14:24

Tak jest!!! Pała!!! Źle zrozumiałeś :) lol

Wujek 18 sierpnia 2006, 17:09

Przepraszam wszystkich za moje wybryki na forum, oczywiście, że jest bład z mojej strony. Pozdro. Po prostu zwiększamy x'a o 8

bartek 21 sierpnia 2006, 16:33

Cytat: Stałe to dane, których wartości nie możemy zmieniać. W pewnym uproszczeniu możemy sobie wyobrazić, że są to zmienne, których wartości są zawsze takie same. Koniec cytatu. Jeżeli stała to nie zmienna!!! Cytat: W C#, tak jak w innych językach obiektowych, mamy typy proste i referencyjne. Koniec cytatu. Tak w C# mamy typy proste, javie też, ale nie jest to regułą w językach obiektowych!!!!!!!

yaro27 11 lipca 2008, 15:26

String typem prostym?? Raczej referencyjnym. Poniższy link wszystko wyjaśnia: http://www.microsoft.com/poland/developer/net/podstawy/clr.mspx

nie 16 września 2008, 14:19


carck3r 1 maja 2009, 21:35

Błąd - string jest typem referencyjnym. Dowód: http://msdn.microsoft.com/en-us/library/490f96s2.aspx

Programista C++ 23 lipca 2009, 10:49

Cytat:
określiliśmy, że obydwa obiekty wskazują na to samo miejsce<br />w pamięci, a więc każda zmiana danych wskazywanych przez jeden z obiektów,<br />powoduje zmianę danych wskazywanych przez drugi

 
Chyba szkoda czasu na ten kurs. Obiekty na coś wskazują? obiekt1 i obiekt2 to nie obiekty tylko referencje do obiektów. A tak BTW po wykonaniu linii biekt2 = obiekt1; w pamięci nie ma już dwóch obiektów tylko jeden, bo drugi zostanie usunięty przez GC. Żenada.<br />

DOŚWIADCZONY programista C# 24 września 2009, 10:49

Cytat: "Do typów prostych należą dane liczbowe takie jak: „int”, „float”, itd., a także typy wyliczeniowe oraz struktury („string” to struktura, a więc jest typem prostym)" Bzdura! Jak już kilka osób wpomniało string jest oczywiście typem referencyjnym jednak jego zachowanie zostało zaimplementowane tak jak struktury, tj. przeciążony został m. in. operator przypisania, który tworzy nowy obiekt string"a. Ponadto największym błędem tego artykułu jest stwierdzenie, że typami prostymi są również wypy wyliczeniowe i struktury (!). Typy proste to NIEKTÓRE struktury, dla których istnieją aliasy, np. dla struktury System.Int32 istnieje alias int, dla System.Double - double, dla System.Int64 - long itp. Ponadto typy proste rządzą się swoimi zasadami: http://msdn.microsoft.com/en-us/library/aa691144(VS.71).aspx

DOŚWIADCZONY programista C# 24 września 2009, 10:55

I jeszcze jedno - autorowi tego artykułu radzę zdobycie większego doświadczenia w programowaniu w platformie .NET przed napisaniem kolejnego artykułu. Wprawdzie minęło już sporo czasu od publikacji tego artykułu jednak to tyczy się każdego innego zagadnienia, gdyż wiele niedoświadczonych osób zagląda tutaj i bierze ten arykuł za pewnik opowiadając innym podobne brednie. Wydaje misię, że należy rozpatrzyć usunięcie tego artukułu lub poprawienie go przez doświadczoną osobę.

nos 2 listopada 2009, 15:45

Dla "DOŚWIADCZONEGO programisty C#" być może są tu jakieś niścisłości, ale dla początkującego, nie ma znaczenia, czy nazwywa się to tak, czy siak. Akurat w tym przypadku chodzi o przyswojenie tych pojeć, a nie o nazwanie ich. To bardzo początkujący kurs i lepiej go nie usuwajcie (błędy można poprawić :)).

StWolf 6 listopada 2009, 11:26

Witam Wlasnie korzystalem z tego artykulu, cos mi nie pasowalo i dzieki niebiosom przeczytalem komentarze... Z mojego punktu widzenia, taki artykul dyskwalifikuje w nauce jezyka! Powód to prawdziwe informacje z zaszytymi powaznymi bledami w tutku, ktore dla swiezaka ( jak ja ;"> ) zapadaja dlugo w pamieci, trudno je potem naprostować! Bardzo mi przykro zolta kartka dla twórcy się należy.

Ryszard 26 stycznia 2010, 13:44

Kurs jest niezwykle prosty, a zarazem merytoryczny, bardzo czytelny i zrozumiały. Czuje się, że Autor jest bardzo dobrym programistą a mimo to nie "cwaniakuje" popisując się swoją wiedzą. Dziękuję!


Dodaj swój komentarz

»Zasady udzielania komentarzy

Autor:  
Komentarz:
Dodaj komentarz
© 2009 Onex Group
Onex Group O Onex Group  |  O CentrumXP.pl  |  Kontakt  |  Reklama
Nasze serwisy: CentrumXP.plSklep on-line  |  Komputer w firmie  |  XboxSpot.pl  |  Live Blog  |  Jama MastahaDevelopers.pl