Sobes.tech
Junior

Какви са референтните типове данни?

sobes.tech AI

Отговор от AI

Типовете данни с препратки не съхраняват самата стойност, а препратка (адрес в паметта) към мястото, където тази стойност се намира.

Характеристики:

  • Променливите от тип препратка могат да съдържат null.
  • При присвояване на стойност от една променлива към друга, не се копира самата стойност, а препратката. И двете променливи започват да сочат към едно и също място в паметта.
  • Промените, направени чрез една препратка, ще бъдат видими чрез другата, ако и двете сочат към един и същ обект.
  • Паметта за обектите от тип препратка се управлява от garbage collector.

Примери за типове данни с препратки:

  • Стрингове (String)
  • Масиви
  • Обекти на потребителски класове
  • Делегати (в някои езици)

Разлика от стойностните типове:

Характеристика Стойностни типове Типове данни с препратки
Съхранение Самата стойност Препратка към стойността
Копиране Копира се самата стойност Копира се препратката
Модифициране Модификациите в копието не влияят на оригинала Модификациите чрез една препратка са видими чрез другата (ако сочат към един и същ обект)
Памет Управлява се от стека (stack) Управлява се от купчината, почиства се от garbage collector
Примери int, float, bool, struct (в някои езици) String, Array, Object
// Пример на C#
string s1 = "Hello"; // s1 сочи към стринг "Hello"
string s2 = s1;      // s2 сочи към същия препратка като s1

// При промяна няма да е видимо през другата препратка,
// защото стринговете са иммутабилни в C#. 
// При промяна се създава нов стринг и препратката се пренасочва.
s1 = "World"; 

Console.WriteLine(s2); // Извежда "Hello"

int[] arr1 = { 1, 2, 3 }; // arr1 сочи към масив {1, 2, 3}
int[] arr2 = arr1;     // arr2 сочи към същия препратка

arr2[0] = 10;          // Промяна чрез arr2

Console.WriteLine(arr1[0]); // Извежда 10, промяната е видима чрез arr1
// Пример на Java
String s1 = "Hello"; // s1 сочи към стринг "Hello"
String s2 = s1;      // s2 сочи към същия препратка като s1

// Стрингите в Java са иммутабилни.
// При промяна се създава нов стринг и препратката се пренасочва.
s1 = "World"; 

System.out.println(s2); // Извежда "Hello"

int[] arr1 = { 1, 2, 3 }; // arr1 сочи към масив {1, 2, 3}
int[] arr2 = arr1;     // arr2 сочи към същия препратка

arr2[0] = 10;          // Промяна чрез arr2

System.out.println(arr1[0]); // Извежда 10, промяната е видима чрез arr1