Oggetti Classe vs Oggetti Struct
Gli oggetti di classe possono essere memorizzati in array, dizionari e liste proprio come gli struct; tuttavia, è importante notare che gli oggetti di classe vengono passati per riferimento mentre gli oggetti struct vengono passati per valore.
Questo concetto è fondamentale perché il passaggio di valori semplici come int
, float
o double
ai metodi è diverso dal passaggio di oggetti complessi e strutture ai metodi. Vediamo un esempio per comprendere meglio questo concetto.
Si creerà un semplice oggetto struct e lo si passerà a un metodo. Si modificherà il suo valore all'interno del metodo e si osserverà cosa succede al valore dell'oggetto originale:
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}"); } }
L'output mostra che il valore di passedObject
è stato aggiornato mentre il valore di originalObject
è rimasto invariato. Questo dimostra che quando si passa un oggetto struct a un metodo, viene creata una copia duplicata di quell'oggetto che viene passata al metodo, ovvero viene passato per valore.
Ora utilizziamo lo stesso codice, cambiando solo il termine struct
con class
:
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}"); } }
Noterai che l'output è cambiato: sia passedObject
che originalObject
hanno lo stesso valore questa volta. Questo dimostra che quando si passa un oggetto di classe a un metodo, viene passata una riferimento all'oggetto originale nel metodo, quindi le modifiche a passedObject
modificano anche originalObject
.
Questa proprietà si applica anche quando si assegnano oggetti a variabili. Di seguito è riportato un esempio che mostra il comportamento di un oggetto struct:
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}"); } }
Lo stesso codice, ma questa volta per un oggetto classe:
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. Gli oggetti classe sono:
2. Il codice seguente dimostra l'utilizzo di oggetti classe con liste e dizionari. Il codice è spiegato nei commenti. Leggi il codice e scegli l'opzione che mostra l'output corretto. Il codice potrebbe essere lungo, ma rappresenta un buon esercizio di lettura del codice.
Grazie per i tuoi commenti!
Chieda ad AI
Chieda ad AI
Chieda pure quello che desidera o provi una delle domande suggerite per iniziare la nostra conversazione
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
Oggetti Classe vs Oggetti Struct
Scorri per mostrare il menu
Gli oggetti di classe possono essere memorizzati in array, dizionari e liste proprio come gli struct; tuttavia, è importante notare che gli oggetti di classe vengono passati per riferimento mentre gli oggetti struct vengono passati per valore.
Questo concetto è fondamentale perché il passaggio di valori semplici come int
, float
o double
ai metodi è diverso dal passaggio di oggetti complessi e strutture ai metodi. Vediamo un esempio per comprendere meglio questo concetto.
Si creerà un semplice oggetto struct e lo si passerà a un metodo. Si modificherà il suo valore all'interno del metodo e si osserverà cosa succede al valore dell'oggetto originale:
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}"); } }
L'output mostra che il valore di passedObject
è stato aggiornato mentre il valore di originalObject
è rimasto invariato. Questo dimostra che quando si passa un oggetto struct a un metodo, viene creata una copia duplicata di quell'oggetto che viene passata al metodo, ovvero viene passato per valore.
Ora utilizziamo lo stesso codice, cambiando solo il termine struct
con class
:
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}"); } }
Noterai che l'output è cambiato: sia passedObject
che originalObject
hanno lo stesso valore questa volta. Questo dimostra che quando si passa un oggetto di classe a un metodo, viene passata una riferimento all'oggetto originale nel metodo, quindi le modifiche a passedObject
modificano anche originalObject
.
Questa proprietà si applica anche quando si assegnano oggetti a variabili. Di seguito è riportato un esempio che mostra il comportamento di un oggetto struct:
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}"); } }
Lo stesso codice, ma questa volta per un oggetto classe:
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. Gli oggetti classe sono:
2. Il codice seguente dimostra l'utilizzo di oggetti classe con liste e dizionari. Il codice è spiegato nei commenti. Leggi il codice e scegli l'opzione che mostra l'output corretto. Il codice potrebbe essere lungo, ma rappresenta un buon esercizio di lettura del codice.
Grazie per i tuoi commenti!