Друга основна разлика между двете е, че class е reference type и при инстанциране се пази в динамичната памет (heap), докато struct е value type и се пази в стека на изпъление на програмата.
Това води до някои разлики и при подаването на двата типа в метод:
- При подаване на референтен тип в метод се подава неговата референция. Това значи, че всички промени, които правиш върху обекта ги правиш върху оригиналния тип.
- При подаване на примитивен тип в метод се подава негово копие. Всички промени, които правиш върху обекта са промени върху копието му. Не засягат оригиналния обект. В случай, че искаш да подадеш самия примитивен тип и да правиш промени върху него, не върху копието му, трябва да го подадеш оказвайте ключовата дума ref, което ще индикира на компилатора, че ще работиш със самия обект.
За по-лесно ще го покажа с пример:
public class Program
{
static void Main(string[] args)
{
var person = new Person();
person.Name = "Martin";
ChangeName(person);
Console.WriteLine("Person name is {0}", person.Name); // Returns "Ivan"
int value = 5;
ChangeValue(value);
Console.WriteLine("Value is {0}", value); // Returns "5"
ChangeValueByReference(ref value);
Console.WriteLine("Value is {0}", value); // Returns "10"
Console.ReadLine();
}
public static void ChangeName(Person person)
{
person.Name = "Ivan";
}
public static void ChangeValue(int value)
{
value = 10;
}
public static void ChangeValueByReference(ref int value)
{
value = 10;
}
}
public class Person
{
public string Name { get; set; }
}
}