Criar dados encapsulados com structs em C#
Ao trabalhar no projeto para acompanhar os detalhes do pedido, você precisa de uma maneira de manter informações relacionadas, como o nome do cliente, o endereço de envio e o total do pedido juntos. Os structs no C# permitem que você crie um contêiner encapsulado básico para esses dados, facilitando o trabalho e a passagem como uma única unidade.
Entender as estruturas
Structs são tipos de valor em C#, o que significa que eles armazenam diretamente seus dados em vez de referenciá-los. Use a struct palavra-chave para definir um struct. Estruturas normalmente são usados para tipos pequenos, centrados em dados que fornecem um comportamento mínimo.
- As estruturas têm semântica de valor, o que significa que seus valores são copiados durante chamadas de atribuição ou método.
- Casos de uso comuns incluem a representação de números, valores boolianos, caracteres e instâncias de tempo.
- Structs são comumente usados para representar dados leves, como formas geométricas (por exemplo,
Rectangle,Circle), coordenadas ou configurações de sistema.
Estruturas são mais adequadas, imutáveis e críticos de desempenho. Para objetos maiores e mais complexos ou quando o foco é o comportamento, considere usar classes. Ao contrário das classes, os structs não podem herdar de outros structs ou classes, mas podem implementar interfaces.
Dica
Se o seu tipo se concentra no comportamento em vez de dados, as classes geralmente são uma escolha melhor devido à semântica de referência.
Definir e implementar uma estrutura
public struct Point
{
public int X;
public int Y;
public Point(int x, int y)
{
X = x;
Y = y;
}
}
O exemplo de código demonstra como definir um struct com campos e um construtor em C#.
Os structs também podem implementar interfaces, mas não podem herdar de outras classes ou structs.
Encapsular dados com estruturas
O encapsulamento permite controlar o acesso aos dados em um struct. Use modificadores de acesso como private, publicou internal para especificar acessibilidade.
- Campos e propriedades podem ser tornados privados para restringir o acesso direto.
- Os métodos podem fornecer maneiras controladas de interagir com os dados.
Por exemplo:
public struct Rectangle
{
private int width;
private int height;
public Rectangle(int width, int height)
{
this.width = width;
this.height = height;
}
public int Area => width * height;
}
O exemplo de código demonstra um struct em C# com campos encapsulados e uma propriedade computada para área.
Aplicar modificador somente leitura às estruturas para imutabilidade
A imutabilidade garante que, uma vez que um struct seja criado, seus dados não possam ser alterados. Um struct é útil ao trabalhar com dados que devem permanecer constantes durante todo o tempo de vida, como coordenadas ou valores de configuração. Ao aplicar o readonly modificador a um struct, você pode impor a imutabilidade, tornando seu código mais previsível e menos propenso a erros causados por modificações não intencionais.
public readonly struct ImmutablePoint
{
public int X { get; init; }
public int Y { get; init; }
public ImmutablePoint(int x, int y)
{
X = x;
Y = y;
}
}
O exemplo de código demonstra o uso do readonly modificador para criar um struct imutável em C#.
Observação
Embora o struct em si seja imutável, tipos de referência mutáveis dentro dele ainda podem alterar seu estado.
Usar inicializadores de objeto com estruturas
Ao trabalhar com structs, você geralmente precisa inicializar várias propriedades. Inicializadores de objeto fornecem uma maneira simples e legível de criar e inicializar instâncias de struct em uma única etapa. Essa abordagem reduz o código repetitivo e deixa sua intenção clara.
O exemplo de código a seguir define um struct com propriedades que agrupam dados relacionados e facilitam a inicialização e o trabalho com instâncias do struct.
public struct Point
{
public int X { get; set; }
public int Y { get; set; }
}
Usando um inicializador de objeto, você pode criar e inicializar um Point:
var point = new Point { X = 10, Y = 20 };
O exemplo de código demonstra como usar um inicializador de objeto para definir valores de propriedade ao criar uma instância de struct.
Dica
Inicializadores de objeto tornam seu código mais conciso e fácil de ler ao trabalhar com structs que têm várias propriedades.
Exemplo prático: usando structs para representar pontos no espaço 2D
Estruturas (structs) são frequentemente usadas para representar pequenas estruturas de dados imutáveis. Por exemplo, você pode usar um struct para representar um ponto no espaço 2D e calcular a distância entre dois pontos:
public struct Point
{
public int X { get; }
public int Y { get; }
public Point(int x, int y)
{
X = x;
Y = y;
}
public double DistanceTo(Point other)
{
int dx = X - other.X;
int dy = Y - other.Y;
return Math.Sqrt(dx * dx + dy * dy);
}
}
var point1 = new Point(3, 4);
var point2 = new Point(7, 1);
Console.WriteLine($"Distance between points: {point1.DistanceTo(point2)}");
Este exemplo demonstra como definir um struct para um ponto, calcular a distância entre dois pontos e usar o struct em um programa simples.
A combinação de encapsulamento, imutabilidade e inicializadores de objeto permite que você crie structs eficientes e previsíveis. Esses recursos ajudam você a gerenciar dados relacionados de maneira limpa e organizada.