Objetos de Classe vs Objetos de Struct
Objetos de classe também podem ser armazenados em Arrays, Dicionários e Listas assim como structs, porém é importante observar que objetos de classe são passados por referência enquanto objetos struct são passados por valor.
Esse conceito é importante porque passar valores simples como int
, float
ou double
para métodos é diferente de passar objetos e estruturas complexas para métodos. Vamos analisar um exemplo para entender melhor esse conceito.
Você irá criar um simples objeto struct e passá-lo para um método. O valor será alterado dentro do método e você verá o que acontece com o valor do objeto original:
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}"); } }
A saída mostra que o valor de passedObject
foi atualizado enquanto o valor de originalObject
permaneceu inalterado. Isso demonstra que, ao passar um objeto struct para um método, uma duplicata desse objeto é criada e passada para o método, ou seja, ele é passado por valor.
Agora, vamos usar exatamente o mesmo código, apenas alterando o termo struct
para 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}"); } }
Você notará que a saída mudou – tanto o passedObject
quanto o originalObject
possuem o mesmo valor desta vez. Isso comprova que, ao passar um objeto de classe para um método, é passada uma referência ao objeto original para o método, fazendo com que alterações em passedObject
também alterem originalObject
.
Essa propriedade também se aplica ao atribuir objetos a variáveis. A seguir, um exemplo que demonstra o comportamento de um objeto 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}"); } }
O mesmo código, mas desta vez para um objeto de 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. Objetos de classe são:
2. O código abaixo demonstra o uso de objetos de classe com listas e dicionários. O código está explicado nos comentários. Leia o código e escolha a opção que mostra a saída correta. O código pode ser extenso, mas é um bom exercício de leitura de código.
Obrigado pelo seu feedback!
Pergunte à IA
Pergunte à IA
Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo
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
Objetos de Classe vs Objetos de Struct
Deslize para mostrar o menu
Objetos de classe também podem ser armazenados em Arrays, Dicionários e Listas assim como structs, porém é importante observar que objetos de classe são passados por referência enquanto objetos struct são passados por valor.
Esse conceito é importante porque passar valores simples como int
, float
ou double
para métodos é diferente de passar objetos e estruturas complexas para métodos. Vamos analisar um exemplo para entender melhor esse conceito.
Você irá criar um simples objeto struct e passá-lo para um método. O valor será alterado dentro do método e você verá o que acontece com o valor do objeto original:
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}"); } }
A saída mostra que o valor de passedObject
foi atualizado enquanto o valor de originalObject
permaneceu inalterado. Isso demonstra que, ao passar um objeto struct para um método, uma duplicata desse objeto é criada e passada para o método, ou seja, ele é passado por valor.
Agora, vamos usar exatamente o mesmo código, apenas alterando o termo struct
para 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}"); } }
Você notará que a saída mudou – tanto o passedObject
quanto o originalObject
possuem o mesmo valor desta vez. Isso comprova que, ao passar um objeto de classe para um método, é passada uma referência ao objeto original para o método, fazendo com que alterações em passedObject
também alterem originalObject
.
Essa propriedade também se aplica ao atribuir objetos a variáveis. A seguir, um exemplo que demonstra o comportamento de um objeto 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}"); } }
O mesmo código, mas desta vez para um objeto de 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. Objetos de classe são:
2. O código abaixo demonstra o uso de objetos de classe com listas e dicionários. O código está explicado nos comentários. Leia o código e escolha a opção que mostra a saída correta. O código pode ser extenso, mas é um bom exercício de leitura de código.
Obrigado pelo seu feedback!