Luokkaoliot vs. Rakenneoliot
Luokkien olioita voidaan tallentaa taulukoihin, sanakirjoihin ja listoihin aivan kuten rakenteitakin, mutta on tärkeää huomata, että luokkaoliot välitetään viittauksina kun taas rakenneoliot välitetään arvoina.
Tämä käsite on tärkeä, koska yksinkertaisten arvojen kuten int
, float
tai double
välittäminen metodeihin eroaa monimutkaisten olioiden ja rakenteiden välittämisestä. Tarkastellaan esimerkkiä tämän käsitteen ymmärtämiseksi paremmin.
Luot yksinkertaisen rakenneolion ja välität sen metodiin. Muutat sen arvoa metodin sisällä ja tarkastelet, mitä alkuperäiselle oliolle tapahtuu:
index.cs
123456789101112131415161718192021222324252627using System; // Defining a simple structure struct Example { public int value; } public class ConsoleApp { static void exampleMethod(Example passedObject) { passedObject.value += 10; Console.WriteLine($"passedObject: {passedObject.value}"); } public static void Main(string[] args) { // Creating and initialising an object Example originalObject = new Example(); originalObject.value = 7; // Passing that object into a method exampleMethod(originalObject); // Checking the value of the originalObject Console.WriteLine($"originalObject: {originalObject.value}"); } }
Tuloste osoittaa, että passedObject
-arvo päivitettiin, kun taas originalObject
-arvo pysyi muuttumattomana. Tämä osoittaa, että kun rakenneolio välitetään metodiin, siitä luodaan kopio, joka välitetään metodiin eli toisin sanoen se välitetään arvona.
Käytetään nyt täsmälleen samaa koodia, vaihdetaan vain struct
-termi class
-termiksi:
index.cs
123456789101112131415161718192021222324252627using System; // Defining a simple class class Example { public int value; } public class ConsoleApp { static void exampleMethod(Example passedObject) { passedObject.value += 10; Console.WriteLine($"passedObject: {passedObject.value}"); } public static void Main(string[] args) { // Creating and initialising an object Example originalObject = new Example(); originalObject.value = 7; // Passing that object into a method exampleMethod(originalObject); // Checking the value of the originalObject Console.WriteLine($"originalObject: {originalObject.value}"); } }
Huomaat, että tuloste on muuttunut – sekä passedObject
että originalObject
sisältävät nyt saman arvon. Tämä osoittaa, että kun luokkaolio välitetään metodille, välitetään viittaus alkuperäiseen olioon, jolloin muutokset passedObject
-olioon vaikuttavat myös originalObject
-olioon.
Tämä ominaisuus pätee myös, kun olioita sijoitetaan muuttujiin. Seuraavassa on esimerkki, joka havainnollistaa rakenneolion käyttäytymistä:
index.cs
12345678910111213141516171819202122232425using System; struct Num { public int value; } public class ConsoleApp { public static void Main(string[] args) { // Creating and initiating 'a' Num a = new Num(); a.value = 7; // Creating 'b' and setting it equal to a. Num b = a; Console.WriteLine($"a is {a.value} and b is {b.value}"); // Now we change the value of 'b' to something else b.value = 9; Console.WriteLine($"a is {a.value} and b is {b.value}"); } }
Sama koodi, mutta tällä kertaa luokkaoliolle:
index.cs
12345678910111213141516171819202122232425using System; class Num { public int value; } public class ConsoleApp { public static void Main(string[] args) { // Creating and initiating 'a' Num a = new Num(); a.value = 7; // Creating 'b' and setting it equal to a. Num b; b = a; Console.WriteLine($"a is {a.value} and b is {b.value}"); // Now we change the value of 'b' to something else b.value = 9; Console.WriteLine($"a is {a.value} and b is {b.value}"); } }
1. Luokkaoliot ovat:
2. Alla oleva koodi havainnollistaa luokkaolioiden käyttöä listojen ja sanakirjojen kanssa. Koodin toiminta on selitetty kommenteissa. Lue koodi ja valitse vaihtoehto, joka näyttää oikean tulosteen. Koodi voi olla pitkä, mutta se on hyvä harjoitus koodin lukemiseen.
Kiitos palautteestasi!
Kysy tekoälyä
Kysy tekoälyä
Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme
Can you explain why structs are passed by value and classes by reference?
Can you provide a real-world scenario where this difference matters?
What happens if I modify a property of a class object inside a method?
Awesome!
Completion rate improved to 2.04
Luokkaoliot vs. Rakenneoliot
Pyyhkäise näyttääksesi valikon
Luokkien olioita voidaan tallentaa taulukoihin, sanakirjoihin ja listoihin aivan kuten rakenteitakin, mutta on tärkeää huomata, että luokkaoliot välitetään viittauksina kun taas rakenneoliot välitetään arvoina.
Tämä käsite on tärkeä, koska yksinkertaisten arvojen kuten int
, float
tai double
välittäminen metodeihin eroaa monimutkaisten olioiden ja rakenteiden välittämisestä. Tarkastellaan esimerkkiä tämän käsitteen ymmärtämiseksi paremmin.
Luot yksinkertaisen rakenneolion ja välität sen metodiin. Muutat sen arvoa metodin sisällä ja tarkastelet, mitä alkuperäiselle oliolle tapahtuu:
index.cs
123456789101112131415161718192021222324252627using System; // Defining a simple structure struct Example { public int value; } public class ConsoleApp { static void exampleMethod(Example passedObject) { passedObject.value += 10; Console.WriteLine($"passedObject: {passedObject.value}"); } public static void Main(string[] args) { // Creating and initialising an object Example originalObject = new Example(); originalObject.value = 7; // Passing that object into a method exampleMethod(originalObject); // Checking the value of the originalObject Console.WriteLine($"originalObject: {originalObject.value}"); } }
Tuloste osoittaa, että passedObject
-arvo päivitettiin, kun taas originalObject
-arvo pysyi muuttumattomana. Tämä osoittaa, että kun rakenneolio välitetään metodiin, siitä luodaan kopio, joka välitetään metodiin eli toisin sanoen se välitetään arvona.
Käytetään nyt täsmälleen samaa koodia, vaihdetaan vain struct
-termi class
-termiksi:
index.cs
123456789101112131415161718192021222324252627using System; // Defining a simple class class Example { public int value; } public class ConsoleApp { static void exampleMethod(Example passedObject) { passedObject.value += 10; Console.WriteLine($"passedObject: {passedObject.value}"); } public static void Main(string[] args) { // Creating and initialising an object Example originalObject = new Example(); originalObject.value = 7; // Passing that object into a method exampleMethod(originalObject); // Checking the value of the originalObject Console.WriteLine($"originalObject: {originalObject.value}"); } }
Huomaat, että tuloste on muuttunut – sekä passedObject
että originalObject
sisältävät nyt saman arvon. Tämä osoittaa, että kun luokkaolio välitetään metodille, välitetään viittaus alkuperäiseen olioon, jolloin muutokset passedObject
-olioon vaikuttavat myös originalObject
-olioon.
Tämä ominaisuus pätee myös, kun olioita sijoitetaan muuttujiin. Seuraavassa on esimerkki, joka havainnollistaa rakenneolion käyttäytymistä:
index.cs
12345678910111213141516171819202122232425using System; struct Num { public int value; } public class ConsoleApp { public static void Main(string[] args) { // Creating and initiating 'a' Num a = new Num(); a.value = 7; // Creating 'b' and setting it equal to a. Num b = a; Console.WriteLine($"a is {a.value} and b is {b.value}"); // Now we change the value of 'b' to something else b.value = 9; Console.WriteLine($"a is {a.value} and b is {b.value}"); } }
Sama koodi, mutta tällä kertaa luokkaoliolle:
index.cs
12345678910111213141516171819202122232425using System; class Num { public int value; } public class ConsoleApp { public static void Main(string[] args) { // Creating and initiating 'a' Num a = new Num(); a.value = 7; // Creating 'b' and setting it equal to a. Num b; b = a; Console.WriteLine($"a is {a.value} and b is {b.value}"); // Now we change the value of 'b' to something else b.value = 9; Console.WriteLine($"a is {a.value} and b is {b.value}"); } }
1. Luokkaoliot ovat:
2. Alla oleva koodi havainnollistaa luokkaolioiden käyttöä listojen ja sanakirjojen kanssa. Koodin toiminta on selitetty kommenteissa. Lue koodi ja valitse vaihtoehto, joka näyttää oikean tulosteen. Koodi voi olla pitkä, mutta se on hyvä harjoitus koodin lukemiseen.
Kiitos palautteestasi!