Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Aprenda Objetos de Classe vs Objetos de Struct | Introdução à Programação Orientada a Objetos (POO)
C# Além do Básico

bookObjetos 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

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

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

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

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

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

O mesmo código, mas desta vez para um objeto de 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. 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.

question mark

Objetos de classe são:

Select the correct answer

question mark

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.

Select the correct answer

Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 3. Capítulo 5

Pergunte à IA

expand

Pergunte à IA

ChatGPT

Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo

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

bookObjetos 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

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

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

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

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

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

O mesmo código, mas desta vez para um objeto de 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. 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.

question mark

Objetos de classe são:

Select the correct answer

question mark

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.

Select the correct answer

Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 3. Capítulo 5
some-alt