Value type och Reference type i C#
Vad innebär Value-Type och Reference-Type i C# ?
En Value type exempelvis en integer(struct) innehåller själva värdet. I detta fallet ett numeriskt heltalsvärde.
En Reference type exempelvis en klass innehåller ett referensvärde till vart objektet är sparat i minnet.
Nedan ger jag lite exempel för att förtydliga:
class Program
{
static void Main(string[] args)
{
// Value type, struct
int firstNumber = 10;
// Reference type of class Car
Car firstCar = new Car() { Name = "Volvo", NumberOfWheels = 4};
// Endast värdet kopieras till secondNumber
int secondNumber = firstNumber;
// Referensvärdet för firstCar kopieras till secondCar.
// Dom har nu en referens till samma objekt i minnet
Car secondCar = firstCar;
// Båda raderna under kommer skriva ut värdet 10.
Console.WriteLine("firstnumber: {0}", firstNumber);
Console.WriteLine("secondNumber: {0}", secondNumber);
// Båda raderna under kommer skriva ut värdet 10.
Console.WriteLine("firstCar.NumberOfWheels: {0}", firstCar.NumberOfWheels);
Console.WriteLine("secondCar.NumberOfWheels: {0}", secondCar.NumberOfWheels);
firstNumber = 20;
firstCar.NumberOfWheels = 8;
// Första raden kommer att skriva ut 20. Andra skriver ut 10.
Console.WriteLine("firstnumber: {0}", firstNumber);
Console.WriteLine("secondNumber: {0}", secondNumber);
// Båda raderna under kommer skriva ut värdet 8.
Console.WriteLine("firstCar.NumberOfWheels: {0}", firstCar.NumberOfWheels);
Console.WriteLine("secondCar.NumberOfWheels: {0}", secondCar.NumberOfWheels);
PassParameterTest(firstNumber, firstCar);
// Första raden kommer att skriva ut 20. Andra skriver ut 10.
Console.WriteLine("firstnumber: {0}", firstNumber);
Console.WriteLine("secondNumber: {0}", secondNumber);
// Båda raderna under kommer skriva ut värdet 16.
Console.WriteLine("firstCar.NumberOfWheels: {0}", firstCar.NumberOfWheels);
Console.WriteLine("secondCar.NumberOfWheels: {0}", secondCar.NumberOfWheels);
firstCar = new Car() { Name = "Volvo", NumberOfWheels = 2 };
// Först raden kommer att skriva ut 2. Andra kommer att skriva ut 16
Console.WriteLine("firstCar.NumberOfWheels: {0}", firstCar.NumberOfWheels);
Console.WriteLine("secondCar.NumberOfWheels: {0}", secondCar.NumberOfWheels);
}
public static void PassParameterTest(int number, Car car)
{
number = 30;
car.NumberOfWheels = 16;
}
}
class Car
{
public string Name { get; set; }
public int NumberOfWheels { get; set; }
}
Varför får vi olika värden på NumberOfWheels på sista exemplet? För att vi instansierar ett nytt objekt och får tillbaka ett nytt referensvärde. Vilket i sin tur gör att firstCar pekar på ett annat objekt i minnet.