Sobes.tech
Junior — Middle

Обяснете какви са типовете данни, които съхраняват препратки към обекти в паметта, и как се различават от стойностните типове.

sobes.tech AI

Отговор от AI

В C# типовете данни се делят на стойностни типове (value types) и референтни типове (reference types).

  • Референтните типове съхраняват в променливата не самите данни, а препратка (указател) към областта в паметта, където се намират данните на обекта. Примери: класове (class), низове (string), масиви.

  • Стойностните типове съхраняват данните директно в променливата. Примери: структури (struct), изброявания (enum), основни типове (int, bool и др.).

Разлики:

  • При присвояване на стойностен тип, се копират самите данни, а при присвояване на референтен тип, се копира препратката към обекта.
  • Референтните типове се разполагат в управлявания куп (heap), а стойностните типове — обикновено в стека или вътре в други обекти.
  • Промените в референтен тип чрез една препратка са видими и през други препратки към същия обект, а при стойностните типове копията са независими.

Пример:

class Person { public string Name; }

struct Point { public int X, Y; }

Person p1 = new Person { Name = "Alice" };
Person p2 = p1; // копиране на препратката
p2.Name = "Bob";
Console.WriteLine(p1.Name); // Ще изведе "Bob" — и двете препратки сочат към един и същи обект

Point pt1 = new Point { X = 1, Y = 2 };
Point pt2 = pt1; // копиране на данните
pt2.X = 10;
Console.WriteLine(pt1.X); // Ще изведе 1 — копията са независими