Klassobjekt kontra Struktur-Objekt
Klassobjekt kan också lagras i arrayer, ordböcker och listor precis som strukturer, men det är viktigt att notera att klassobjekt överförs som referenser medan struktobjekt överförs som värden.
Detta koncept är viktigt eftersom det skiljer sig åt att skicka enkla värden som int
, float
eller double
till metoder jämfört med att skicka komplexa objekt och strukturer till metoder. Låt oss titta på ett exempel för att förstå detta koncept bättre.
Du kommer att skapa ett enkelt struktobjekt och skicka det till en metod. Du kommer att ändra dess värde inifrån metoden och se vad som händer med värdet på det ursprungliga objektet:
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}"); } }
Utdata visar att värdet på passedObject
uppdaterades medan värdet på originalObject
förblev oförändrat. Detta visar att när du skickar ett struktobjekt till en metod skapas en kopia av det objektet och skickas till metoden, eller med andra ord, det överförs som värde.
Nu använder vi exakt samma kod, men byter ut termen struct
mot 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}"); } }
Du kommer att märka att utdata har ändrats – både passedObject
och originalObject
har nu samma värde. Detta bevisar att när du skickar ett klassobjekt till en metod, skickas en referens till det ursprungliga objektet in i metoden, vilket gör att ändringar på passedObject
även ändrar originalObject
.
Denna egenskap gäller också när objekt tilldelas variabler. Nedan följer ett exempel som visar beteendet hos ett struct-objekt:
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}"); } }
Samma kod men denna gång för ett klassobjekt:
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. Klassobjekt är:
2. Koden nedan visar användningen av klassobjekt med listor och ordböcker. Koden förklaras i kommentarerna. Läs koden och välj det alternativ som visar rätt utdata. Koden kan vara lång, men det är en bra övning i kodläsning.
Tack för dina kommentarer!
Fråga AI
Fråga AI
Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal
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
Klassobjekt kontra Struktur-Objekt
Svep för att visa menyn
Klassobjekt kan också lagras i arrayer, ordböcker och listor precis som strukturer, men det är viktigt att notera att klassobjekt överförs som referenser medan struktobjekt överförs som värden.
Detta koncept är viktigt eftersom det skiljer sig åt att skicka enkla värden som int
, float
eller double
till metoder jämfört med att skicka komplexa objekt och strukturer till metoder. Låt oss titta på ett exempel för att förstå detta koncept bättre.
Du kommer att skapa ett enkelt struktobjekt och skicka det till en metod. Du kommer att ändra dess värde inifrån metoden och se vad som händer med värdet på det ursprungliga objektet:
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}"); } }
Utdata visar att värdet på passedObject
uppdaterades medan värdet på originalObject
förblev oförändrat. Detta visar att när du skickar ett struktobjekt till en metod skapas en kopia av det objektet och skickas till metoden, eller med andra ord, det överförs som värde.
Nu använder vi exakt samma kod, men byter ut termen struct
mot 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}"); } }
Du kommer att märka att utdata har ändrats – både passedObject
och originalObject
har nu samma värde. Detta bevisar att när du skickar ett klassobjekt till en metod, skickas en referens till det ursprungliga objektet in i metoden, vilket gör att ändringar på passedObject
även ändrar originalObject
.
Denna egenskap gäller också när objekt tilldelas variabler. Nedan följer ett exempel som visar beteendet hos ett struct-objekt:
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}"); } }
Samma kod men denna gång för ett klassobjekt:
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. Klassobjekt är:
2. Koden nedan visar användningen av klassobjekt med listor och ordböcker. Koden förklaras i kommentarerna. Läs koden och välj det alternativ som visar rätt utdata. Koden kan vara lång, men det är en bra övning i kodläsning.
Tack för dina kommentarer!