Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Impara Oggetti Classe vs Oggetti Struct | Introduzione alla Programmazione Orientata agli Oggetti (OOP)
C# Oltre le Basi

bookOggetti 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

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}"); } }

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

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}"); } }

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

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}"); } }

Lo stesso codice, ma questa volta per un oggetto classe:

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. 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.

question mark

Gli oggetti classe sono:

Select the correct answer

question mark

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.

Select the correct answer

Tutto è chiaro?

Come possiamo migliorarlo?

Grazie per i tuoi commenti!

Sezione 3. Capitolo 5

Chieda ad AI

expand

Chieda ad AI

ChatGPT

Chieda pure quello che desidera o provi una delle domande suggerite per iniziare la nostra conversazione

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

bookOggetti 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

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}"); } }

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

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}"); } }

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

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}"); } }

Lo stesso codice, ma questa volta per un oggetto classe:

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. 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.

question mark

Gli oggetti classe sono:

Select the correct answer

question mark

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.

Select the correct answer

Tutto è chiaro?

Come possiamo migliorarlo?

Grazie per i tuoi commenti!

Sezione 3. Capitolo 5
some-alt