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