Sobes.tech
Junior

Kas ir atsauces datu tipi?

sobes.tech AI

Atbilde no AI

Saistītu datu tipu vērtības nesaglabā pašu vērtību, bet saiti (adresu atmiņā) uz vietu, kur šī vērtība atrodas.

Īpatnības:

  • Saistītu tipu mainīgie var saturēt null.
  • Kad viena saistīta tipa mainīgā vērtība tiek piešķirta citai, kopē ne pati vērtība, bet saite. Abi mainīgie sāk norādīt uz to pašu atmiņas vietu.
  • Izmaiņas, kas veiktas ar vienu saiti, būs redzamas ar otru, ja tie norāda uz to pašu objektu.
  • Atmiņa saistītu tipu objektiem tiek pārvaldīta ar atkritumu savācēju.

Saistītu tipu piemēri:

  • Rindas (String)
  • Masīvi
  • Lietotāja klases objekti
  • Delegāti (kādās valodās)

Atšķirība no vērtību tipiem:

Raksturlielums Vērtību tipi Saistītu tipu tipi
Glabāšana Pašas vērtības Saite uz vērtību
Kopēšana Kopē pati vērtība Kopē saiti
Izmaiņas Izmaiņas kopijā neietekmē oriģinālu Izmaiņas ar vienu saiti ir redzamas ar otru (ja tie norāda uz to pašu objektu)
Atmiņa Pārvaldīta ar steku (stack) Pārvaldīta ar atkritumu savācēju, tiek notīrīta
Piemēri int, float, bool, struct (kādās valodās) String, Array, Object
// Piemērs C#
string s1 = "Hello"; // s1 norāda uz virkni "Hello"
string s2 = s1;      // s2 norāda uz to pašu saiti kā s1

// Izmaiņas nebūs redzamas ar otru saiti,
// jo virknes C# ir nemainīgas. 
// Izmaiņas gadījumā tiek izveidota jauna virkne un saite tiek pārvirzīta.
s1 = "World"; 

Console.WriteLine(s2); // Izvadīs "Hello"

int[] arr1 = { 1, 2, 3 }; // arr1 norāda uz masīvu {1, 2, 3}
int[] arr2 = arr1;     // arr2 norāda uz to pašu saiti

arr2[0] = 10;          // Izmaiņas ar arr2

Console.WriteLine(arr1[0]); // Izvadīs 10, izmaiņas ir redzamas arī ar arr1
// Piemērs Java
String s1 = "Hello"; // s1 norāda uz virkni "Hello"
String s2 = s1;      // s2 norāda uz to pašu saiti kā s1

// Virknes Java ir nemainīgas.
// Izmaiņas gadījumā tiek izveidota jauna virkne un saite tiek pārvirzīta.
s1 = "World"; 

System.out.println(s2); // Izvadīs "Hello"

int[] arr1 = { 1, 2, 3 }; // arr1 norāda uz masīvu {1, 2, 3}
int[] arr2 = arr1;     // arr2 norāda uz to pašu saiti

arr2[0] = 10;          // Izmaiņas ar arr2

System.out.println(arr1[0]); // Izvadīs 10, izmaiņas ir redzamas arī ar arr1