Entendendo Structs em C#: Definição, Uso e Diferenças-Chave
Structs em C#
Aprenda como definir, instanciar e trabalhar com structs em C#, incluindo construtores, propriedades e suas principais diferenças em relação a classes.
Em C#, uma struct (estrutura) funciona de forma semelhante a uma classe, mas é um tipo de valor, o que significa que armazena dados diretamente em vez de uma referência.
Suponha que queremos armazenar o nome e a idade de uma pessoa. Podemos criar duas variáveis: nome e idade e armazenar valores.
No entanto, se precisarmos manter essa informação para várias pessoas, declarar variáveis separadas torna-se tedioso. Definir uma struct que contenha nome e idade permite reutilizar o mesmo layout para cada pessoa.
Definir struct em C#
Em C#, usamos a palavra-chave struct para declarar uma struct. Por exemplo:
struct Funcionario { public int id; }
Aqui, id é um campo dentro da struct. Uma struct também pode conter métodos, indexadores e mais.
Declarar variável struct
Antes de usar uma struct, você deve criar uma variável do tipo struct. A sintaxe é:
struct Funcionario { public int id; } // declara emp do tipo struct Funcionario Funcionario emp;
No exemplo, definimos uma struct chamada Funcionario e declaramos uma variável emp desse tipo.
Acessar struct em C#
Acesse membros da struct usando o operador ponto (.):
Funcionario emp; emp.id = 1;
Isso atribui o valor 1 ao campo id da struct Funcionario.
Nota: Tipos primitivos como int, bool e float são structs pré-definidas em C#.
Exemplo: Struct em C#
using System; namespace CsharpStruct { // definindo struct struct Funcionario { public int id; public void ObterId(int id) { Console.WriteLine("ID do Funcionário: " + id); } } class Program { static void Main(string[] args) { // declara emp do tipo struct Funcionario Funcionario emp; // acessa e define campo da struct emp.id = 1; // acessa métodos da struct emp.ObterId(emp.id); Console.ReadLine(); } } }
Saída
ID do Funcionário: 1
O programa cria uma struct Funcionario, define seu campo id e chama o método ObterId para exibi-lo.
Você também pode instanciar uma struct com a palavra-chave new:
Funcionario emp = new Funcionario();
Isso chama o construtor sem parâmetros e inicializa todos os campos com seus valores padrão.
Construtores em Structs C#
Structs podem definir construtores para inicializar campos. Exemplo:
struct Funcionario { public int id; // construtor public Funcionario(int idFuncionario) { id = idFuncionario; } }
Nota: Antes do C# 10, structs não podem conter construtores sem parâmetros.
Exemplo: Construtor em Structs C#
using System; namespace CsharpStruct { // definindo struct struct Funcionario { public int id; public string nome; // construtor parametrizado public Funcionario(int idFuncionario, string nomeFuncionario) { id = idFuncionario; nome = nomeFuncionario; } } class Program { static void Main(string[] args) { // chama construtor da struct Funcionario emp = new Funcionario(1, "Brian"); Console.WriteLine("Nome do Funcionário: " + emp.nome); Console.WriteLine("ID do Funcionário: " + emp.id); Console.ReadLine(); } } }
Saída
Nome do Funcionário: Brian ID do Funcionário: 1
Neste exemplo, o construtor atribui valores a todos os campos. Falhar em inicializar todo campo resulta em erro de compilação.
Propriedades em Structs C#
Structs podem expor propriedades para encapsulamento. Exemplo:
using System; namespace CsharpStruct { // definindo struct struct Funcionario { public int id; // cria propriedade public int Id { get { return id; } set { id = value; } } } class Program { static void Main(string[] args) { Funcionario emp = new Funcionario(); emp.Id = 1; Console.WriteLine("ID do Funcionário: " + emp.Id); Console.ReadLine(); } } }
Saída
ID do Funcionário: 1
Aqui, a propriedade Id fornece acesso controlado ao campo id.
Diferença entre class e struct em C#
Embora classes e structs compartilhem sintaxe semelhante, elas diferem fundamentalmente:
- Uma classe é um tipo de referência; uma struct é um tipo de valor.
- Atribuir uma instância de classe copia a referência, então duas variáveis apontam para o mesmo objeto. Atribuir uma struct copia o valor inteiro.
- Structs não suportam herança, enquanto classes suportam.
Exemplo de comportamento de referência de classe:
using System; namespace CsharpStruct { class Funcionario { public string nome; } class Program { static void Main(string[] args) { Funcionario emp1 = new Funcionario(); emp1.nome = "João"; Funcionario emp2 = emp1; emp2.nome = "Ed"; Console.WriteLine("Nome do Funcionário1: " + emp1.nome); Console.ReadLine(); } } }
Saída
Nome do Funcionário1: Ed
Exemplo de comportamento de valor de struct:
using System; namespace CsharpStruct { struct Funcionario { public string nome; } class Program { static void Main(string[] args) { Funcionario emp1 = new Funcionario(); emp1.nome = "João"; Funcionario emp2 = emp1; emp2.nome = "Ed"; Console.WriteLine("Nome do Funcionário1: " + emp1.nome); Console.ReadLine(); } } }
Saída
Nome do Funcionário1: João
No exemplo da struct, emp2 recebe uma cópia de emp1, então modificações em emp2 não afetam emp1.
Essas distinções tornam structs ideais para pequenas estruturas de dados imutáveis que se beneficiam de alocação na stack e semântica de valor.
Linguagem C
- Dominando Structs em C: Definição, Variáveis, Acesso e Exemplos Avançados
- Dominando Structs e Ponteiros em C: Guia Prático
- Dominando Structs em C: Passagem, Retorno e Manipulação por Referência
- Mantenha-se à Frente no Futuro do Trabalho: Estratégias para Vencer a Concorrência
- Structs em C++ Explicadas com Exemplo Prático
- O Caso para Modernizar o Agendamento de Funcionários para Aumentar Retenção e Produtividade
- Melhorar a Segurança no Local de Trabalho: Por Que as Re-Verificações Periódicas de Antecedentes dos Funcionários Importam
- 4 Estratégias Comprovadas para Fortalecer o Envolvimento dos Funcionários em Meio à COVID-19
- DVIRC Promove Alan Shell a Diretor de Serviços Lean/CI e Contrata Novos Talentos
- Análise de Produtividade de Funcionários: Desbloqueando Insights na Era da IoT