Contenu du cours
C# au-delà des Bases
C# au-delà des Bases
Objets de Classe vs Objets Struct
Les objets de classe peuvent également être stockés dans des tableaux, des dictionnaires et des listes tout comme les structures, cependant, il est important de noter que les objets de classe sont passés par référence tandis que les objets de structure sont passés par valeur.
Ce concept est important car passer des valeurs simples comme int
, float
ou double
dans des méthodes est différent de passer des objets complexes et des structures dans des méthodes. Regardons un exemple pour mieux comprendre ce concept.
Nous allons créer un simple objet struct et le passer dans une méthode. Nous allons changer sa valeur depuis l'intérieur de la méthode et voir ce qui arrive à la valeur de l'objet original :
index
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}"); } }
La sortie montre que la valeur de passedObject
a été mise à jour tandis que la valeur de originalObject
est restée inchangée. Cela montre que lorsque nous passons un objet struct à une méthode, un duplicata de cet objet est créé et passé à la méthode, ou en d'autres termes, il est passé par valeur.
Maintenant, utilisons exactement le même code, en changeant seulement le terme struct
en class
:
index
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}"); } }
Vous remarquerez que la sortie a changé - cette fois, passedObject
et originalObject
ont la même valeur. Cela prouve que lorsque nous passons un objet de classe à une méthode, il passe une référence à l'objet original dans la méthode, ce qui fait que les modifications apportées à passedObject
modifient originalObject
.
Cette propriété s'applique également lors de l'affectation d'objets à des variables. Voici un exemple qui montre le comportement d'un objet struct :
index
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}"); } }
Le même code mais cette fois pour un objet de classe :
index
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. Les objets de classe sont :
2. Le code ci-dessous démontre l'utilisation des objets de classe avec des listes et des dictionnaires. Le code est expliqué dans les commentaires. Lisez le code et choisissez l'option qui montre le résultat correct. Le code peut être long, mais c'est un bon exercice de lecture de code.
Merci pour vos commentaires !