Middle
Kokie yra skirtumai tarp vertės tipo ir nuorodos tipo programavimo kalbose?
sobes.tech AI
Atsakymas iš AI
Vertės tipai (pavyzdžiui, struct, enum, pagrindiniai skaitmeniniai tipai) saugo savo reikšmę tiesiogiai. Priskiriant arba perduodant funkcijai, sukuriama reikšmės kopija.
Nuorodų tipai (pavyzdžiui, class, function, closure) saugo nuorodą į atminties vietą, kur yra pati reikšmė. Priskiriant arba perduodant, sukuriama nuorodos kopija, nurodanti į tą patį reikšmės vietą atmintyje.
Pagrindiniai skirtumai:
| Savybė | Vertės tipas | Nuorodų tipas |
|---|---|---|
| Saugojimo būdas | Reikšmė saugoma tiesiogiai kintamajame | Kintamasis saugo nuorodą į reikšmę |
| Priskyrimas | Kopijuojama reikšmė | Kopijuojama nuoroda (nurodo į tą patį objektą) |
| Keitimas | Keitimas kopijoje neįtakoja originalo | Keitimas nuorodoje veikia originalą |
| Atminties vieta | Paprastai, stekas (vietiniams kintamiesiems) | Paprastai, krūva |
| Atminties valdymas | Automatinis (išėjus iš matymo srities) | ARC (Automatinis nuorodų valdymas) |
Pavyzdys Swift kalba:
// vertės tipas
struct PointStruct {
var x: Int
var y: Int
}
var point1 = PointStruct(x: 1, y: 2)
var point2 = point1 // kopijuojama reikšmė
point2.x = 10
print(point1.x) // išves 1
print(point2.x) // išves 10
// nuorodų tipas
class PointClass {
var x: Int
var y: Int
init(x: Int, y: Int) {
self.x = x
self.y = y
}
}
var point3 = PointClass(x: 1, y: 2)
var point4 = point3 // sukuriama nuoroda
point4.x = 10
print(point3.x) // išves 10 (reikšmė pasikeitė per nuorodą)
print(point4.x) // išves 10