Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Oppiskele Luokkaoliot vs. Rakenneoliot | Johdatus Olio-Ohjelmointiin (OOP)
C# Perusteiden Jälkeen

bookLuokkaoliot 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

index.cs

copy
123456789101112131415161718192021222324252627
using 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

index.cs

copy
123456789101112131415161718192021222324252627
using 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

index.cs

copy
12345678910111213141516171819202122232425
using 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

index.cs

copy
12345678910111213141516171819202122232425
using 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.

question mark

Luokkaoliot ovat:

Select the correct answer

question mark

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.

Select the correct answer

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 3. Luku 5

Kysy tekoälyä

expand

Kysy tekoälyä

ChatGPT

Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme

Suggested prompts:

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

bookLuokkaoliot 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

index.cs

copy
123456789101112131415161718192021222324252627
using 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

index.cs

copy
123456789101112131415161718192021222324252627
using 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

index.cs

copy
12345678910111213141516171819202122232425
using 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

index.cs

copy
12345678910111213141516171819202122232425
using 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.

question mark

Luokkaoliot ovat:

Select the correct answer

question mark

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.

Select the correct answer

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 3. Luku 5
some-alt