Taulukon Kopiointi ja Muisti
Pyyhkäise näyttääksesi valikon
Kun työskentelet taulukoiden kanssa C#:ssa, on tärkeää ymmärtää, miten ne tallennetaan muistiin ja mitä tapahtuu, kun kopioit tai sijoitat niitä. Taulukot C#:ssa ovat viitetyyppejä, mikä tarkoittaa, että muuttujat sisältävät viittauksen (tai osoittimen) siihen, missä taulukon tiedot sijaitsevat muistissa, eivät itse tietoja. Tällä on merkittäviä vaikutuksia, kun sijoitat yhden taulukkoviitteen toiseen muuttujaan tai kun haluat tehdä aidon kopion taulukon sisällöstä. Jos nämä yksityiskohdat jäävät huomaamatta, saatat vahingossa muuttaa tietoja paikoissa, joissa et sitä tarkoittanut, mikä voi johtaa vaikeasti jäljitettäviin virheisiin.
Program.cs
12345678910111213141516171819202122232425262728293031namespace ConsoleApp { public class Program { public static void Main(string[] args) { int[] original = { 1, 2, 3, 4, 5 }; // Assigning the array reference int[] assigned = original; // Copying the array elements int[] copied = new int[original.Length]; for (int i = 0; i < original.Length; i++) { copied[i] = original[i]; } // Modify the assigned array assigned[0] = 99; // Modify the copied array copied[1] = 77; System.Console.WriteLine("original: " + string.Join(", ", original)); System.Console.WriteLine("assigned: " + string.Join(", ", assigned)); System.Console.WriteLine("copied: " + string.Join(", ", copied)); } } }
Kun sijoitat yhden taulukkoviitteen toiseen, molemmat muuttujat osoittavat samaan muistipaikkaan. Tämä tarkoittaa, että yhden muuttujan kautta tehdyt muutokset näkyvät myös toisessa, koska ne ovat vain kaksi viittausta samaan taulukkoon. Jos haluat välttää tämän, jokainen alkio täytyy kopioida uuteen taulukkoon, kuten yllä olevassa koodissa on esitetty. Tämä luo uuden taulukon muistiin, joten muutokset toiseen taulukkoon eivät vaikuta toiseen.
Tämä liittyy käsitteisiin pintapuolinen kopio (shallow copy) ja syvä kopio (deep copy). Pintapuolinen kopio kopioi vain viittauksen taulukkoon, ei varsinaisia alkioita. Syvä kopio luo uuden taulukon ja kopioi jokaisen alkion siihen, jolloin tuloksena on kaksi toisistaan riippumatonta taulukkoa.
Program.cs
1234567891011121314151617namespace ConsoleApp { public class Program { public static void Main(string[] args) { int[] numbers = { 10, 20, 30 }; int[] shallow = numbers; shallow[1] = 99; System.Console.WriteLine("numbers: " + string.Join(", ", numbers)); System.Console.WriteLine("shallow: " + string.Join(", ", shallow)); } } }
Tämä koodiesimerkki havainnollistaa, mitä tapahtuu, kun suoritat matalan kopion (shallow copy) taulukosta C#:ssa. Kun asetat yhden taulukkomuuttujan toisen arvoksi, kuten int[] shallow = numbers, et luo uutta taulukkoa tai kopioi alkioita. Sen sijaan molemmat muuttujat, numbers ja shallow, viittaavat samaan taulukkoon muistissa. Tämä tarkoittaa, että kaikki muutokset, jotka teet toisen muuttujan kautta, näkyvät myös toisen kautta.
Matalan kopion (shallow copy) tapauksessa viittaus taulukkoon kopioidaan, joten molemmat muuttujat osoittavat samaan muistipaikkaan. Syvä kopio (deep copy) luo uuden taulukon ja kopioi kaikki alkiot, jolloin taulukot ovat toisistaan riippumattomia.
1. Mitä tapahtuu, kun asetat yhden taulukkomuuttujan toisen arvoksi C#:ssa?
2. Miten voit luoda aidon kopion taulukosta?
3. Miksi taulukkomuistin ymmärtäminen on tärkeää tietoja käsiteltäessä?
Kiitos palautteestasi!
Kysy tekoälyä
Kysy tekoälyä
Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme