C# TYPY REFERENCYJNE


Ta lekcja choć krótka to bardzo ważna, otóż omówimy w niej zmienne referencyjne i przypisanie. Naturalnie zaczniemy trochę od teorii. Obiekty które tworzyliśmy naszych klas np. Pojazd to typ referencyjny, nie tworzyliśmy tak naprawdę typu prostego (typ wartości) tylko referencję do tego obiektu, referencja to inaczej odniesienie, przez cały czas posługiwaliśmy się w naszych klasach tylko tymi referencjami. Przypuśćmy, że mamy dwa obiekty pojazd1 oraz pojazd2 jednej klasy Pojazd, jeżeli byśmy wykonali taki zapis pojazd1 = pojazd2 ; to tak na pierwszy rzut oka wydaje się że „skopiowaliśmy” do pojazd1 wartość obiektu pojazd2, ale ten pierwszy rzut oka był błędny tak naprawdę przekazaliśmy do pojazd1 referencje do obiektu na który referował od początku pojazd2 teraz pojazd1 i pojazd2 odnoszą się do tego samego obiektu, każda zmiana dokonana na pojazd1 będzie widoczna na obiekcie pojazd2 oraz vice versa. Dobrze abyś sobie uzmysłowił sobie jak to wygląda, prześledź sobie poniższy kod:

Początek kodu:
using System;


class Pojazd
{
public string rocznik = „”;


public Pojazd(string rok)
{
rocznik = rok;
}
}


class Pokaz {


public static void Main() {
Pojazd pojazd1 = new Pojazd(„1983″);
Pojazd pojazd2 = new Pojazd(„1999″);
Pojazd pojazd3 ;


pojazd3 = pojazd2 ;
Console.WriteLine(„Pojazd3 ma rocznik: ” + pojazd3.rocznik);
Console.WriteLine(„Pojazd2 ma rocznik: ” + pojazd2.rocznik);


//Zmiana rocznika w obiekcie pojazd3
pojazd3.rocznik = „2004″;
Console.WriteLine(„\nZMIANA\n”);


Console.WriteLine(„Pojazd3 ma rocznik: ” + pojazd3.rocznik);
Console.WriteLine(„Pojazd2 ma rocznik: ” + pojazd2.rocznik);

pojazd2 = pojazd1;
Console.WriteLine(„\nZMIANA\n”);
Console.WriteLine(„Pojazd1 ma rocznik: ” + pojazd1.rocznik);
Console.WriteLine(„Pojazd2 ma rocznik: ” + pojazd2.rocznik);
}

}

Koniec kodu:

I teraz wszystko jasne, dlaczego tak się dzieje to wyjaśnione zostało przed ukazaniem przykładu, po prostu nie operujemy na konkretnych wartościach tylko na referencjach, czyli odniesieniach do obiektów wartości. Warto wspomnieć jest o jednym, że istnieję inne typy wartości takie jak bezpośrednie oraz proste. Typy bezpośrednie oraz proste są ze sobą nie rozerwalnie złączone, typy proste to zazwyczaj typy wbudowane takie jak int, double, ushort itp. Jednak można się bezpośrednio odnieść do takiego typu prostego następująco:

int mojaliczba = new int(); // Wywołanie domyślnego konstruktora.

mojaliczba = 3533 ; // Przypisanie wartości początkowej.

W typach bezpośrednich oraz prostych, przypisując jeden obiekt do drugiego dzieje się inaczej niż w typach referencyjnych, otóż tutaj jest przekazywana kopia wartości, a nie kopia referencji. Przecież jak mamy dwie zmienne int to przypisując jednej wartość do drugiej to przecież kopiujemy te wartości. Mam nadzieję, że ta lekcja jakoś została zrozumiana.