Az adattípusok egyik csoportosítási szempontja aszerint tér el, hogy az adott típus direkt, vagy indirekt módon származik le az ős objektumból, a System.Object-ből. Ha a típusunk direkt módon származik a System.Object-ből, akkor referenciatípus, hogyha pedig indirekt, akkor pedig érték típus lesz.
Érték típusok:
- Egyszerű típusok, azaz az egész és lebegőpontos számok, logikai érték, karakter.
- Enum
- Struktúra
- Null-ozható típusok
Referencia típusok:
- Osztály
- Interfész
- String (szöveg)
- Tömb
- Delegáltak
Na de miért is fontos ez?
A különbség a gyakorlatban látszik talán igazán. A referenciatípusok csak az objektumra mutató hivatkozás címét tartalmazzák, nem pedig az egész objektumot.
Például, ha létrehozunk egy objektumot, majd az arra mutató hivatkozást tovább adjuk, akkor az eredeti objektum tulajdonságait tudjuk módosítani.
class Dog
{
public string Name { get; set; }
}
static void Main(string[] args)
{
Dog kutya = new Dog();
kutya.Name = "Bodri";
Console.WriteLine(kutya.Name);
NevezdAtBrumira(kutya);
Console.WriteLine(kutya.Name);
}
static void NevezdAtBrumira(Dog kutya)
{
kutya.Name = "Brumi";
}
Konzol alkalmazásunkban létrehoztunk egy privát Dog osztályt, melynek adtunk egy Name tulajdonságot, majd példányosítottuk és elneveztük Bodri-nak. Ezt követően átadtuk a kutya objektumunkat a NevezdAtBrumira függvényünknek, amely által a függvény meg tudta változtatni Bodri nevét Brumira, mert valójában nem az egész objektumunkat adtuk át, hanem az arra mutató címet. Az alkalmazásunk kimenete Bodri, majd Brumi lesz.
Hogyha ugyan ezt egy érték típussal tettük volna meg, azaz nem egy objektumot adunk át a függvényünknek, hanem egy érték típust, és azt megváltoztatjuk, akkor a változtatásnak nem lesz hatása az eredeti változónkra, hiszen ilyenkor az függvényen belül az értékünk másolva lesz.
Kapcsolódó bejegyzések
Források:
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/reference-types
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/builtin-types/value-types