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.