English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Estrutura (Struct) do C#

 No C#, a struct é um tipo de dados de valor de estrutura de dados orientada a objetos. Ela pode conter construtor parametrizado, construtor estático, constantes, campos, métodos, propriedades, índices, operadores, eventos e tipos aninhados.

A struct pode ser usada para armazenar pequenos valores de dados não necessários para herança, como pontos de coordenadas, pares chave-valor e estruturas de dados complexas.

Declaração de Estrutura

Usa a palavra-chave struct para declarar a estrutura. O modificador padrão é o modificador interno da estrutura e de seus membros.

O exemplo a seguir declara a estrutura de gráfico de coordenadas.

struct Coordinate
{
    public int x;
    public int y;
}

Como variáveis de tipos básicos, pode-se criar objetos struct usando ou não o operador new.

struct Coordinate
{
    public int x;
    public int y;
}
Coordinate point = new Coordinate();
Console.WriteLine(point.x); //Saída: 0  
Console.WriteLine(point.y); //Saída: 0

Acima, criou um objeto da estrutura Coordinate (coordenada) usando a palavra-chave new. Ele chama o construtor padrão sem parâmetros da estrutura, que inicializa todos os membros com valores padrão do tipo de dados especificado.

Se declarar uma variável do tipo struct sem usar a palavra-chave new, ela não chama nenhum construtor, portanto todos os membros permanecem em estado não alocado. Portanto, antes de acessar cada membro, deve atribuir valores a eles, caso contrário, ocorrerá erro de tempo de compilação.

struct Coordinate
{
    public int x;
    public int y;
}
Coordinate point;
Console.Write(point.x); // Erro de Tempo de Compilação  
point.x = 10;
point.y = 20;
Console.Write(point.x); //Saída:10  
Console.Write(point.y); //Saída:20

Construtor da Estrutura

A struct (struct) não pode conter construtor sem parâmetros. Ela pode conter apenas construtor parametrizado ou construtor estático.

struct Coordinate
{
    public int x;
    public int y;
    public Coordinate(int x, int y)
    {
        this.x = x;
        this.y = y;
    }
}
Coordinate point = new Coordinate(10, 20);
Console.WriteLine(point.x); //Saída:10  
Console.WriteLine(point.y); //Saída:20

Deve incluir todos os membros da estrutura no construtor parametrizado e atribuí-los aos membros; caso contrário, se qualquer membro permanecer não alocado, o compilador C# fornecerá um erro de tempo de compilação.

Métodos e Propriedades da Estrutura

A struct (estrutura) pode conter propriedades, propriedades implementadas automaticamente, métodos, etc., como a classe.

struct Coordinate
{
    public int x { get; set; }
    public int y { get; set; }
    public void SetOrigin()
    {
        this.x = 0;
        this.y = 0;
    }
}
Coordinate point = Coordinate();
point.SetOrigin();
Console.WriteLine(point.x); //Saída: 0  
Console.WriteLine(point.y); //Saída: 0

A seguir, struct inclui métodos estáticos.

struct Coordinate
{
    public int x;
    public int y;
    public Coordinate(int x, int y)
    {
        this.x = x;
        this.y = y;
    }
    public static Coordinate GetOrigin()
    {
        return new Coordinate();
    }
}
Coordinate point = Coordinate.GetOrigin();
Console.WriteLine(point.x); //Saída: 0  
Console.WriteLine(point.y); //Saída: 0

Eventos de estrutura

As estruturas podem conter notificações de eventos para assinantes sobre certas operações. A estrutura (struct) a seguir contém um evento.

struct Coordinate
{
    private int _x, _y;
    public int x 
    {
        get{
            return _x;
        }
        set{
            _x = value;
            CoordinatesChanged(_x);
        }
    }
    public int y
    {
        get{
            return _y;
        }
        set{
            _y = value;
            CoordinatesChanged(_y);
        }
    }
    public event Action<int> CoordinatesChanged;
}

O código acima contém o evento coordinateChanged, que é acionado quando as coordenadas x ou y mudam. O exemplo a seguir demonstra como tratar o evento CoordinateChanged.

class Program
{
    static void Main(string[] args)
    {
        Coordinate point = new Coordinate();
        
        point.CoordinatesChanged += StructEventHandler;
        point.x = 10;
        point.y = 20;
    }
    static void StructEventHandler(int point)
    {
        Console.WriteLine("O ponto de coordenadas muda para {0}", point);
    }
}

A struct é um tipo de valor, portanto, é mais rápida que os objetos de classe. Sempre que você quiser armazenar dados, use struct. Geralmente, a estrutura é aplicável ao desenvolvimento de jogos. No entanto, é mais fácil transmitir objetos de classe do que estruturas. Portanto, quando você passar dados pela rede ou por outros tipos, não use struct.

Resumo

  • A estrutura pode incluir construtores, constantes, campos, métodos, propriedades, índices, operadores, eventos e tipos aninhados.

  • A estrutura não pode conter construtores sem parâmetros ou destrutores.

  • A estrutura pode implementar interfaces idênticas às de uma classe.

  • A estrutura não pode herdar outra estrutura ou classe, nem pode ser usada como base para uma classe.

  • A estrutura não pode ter membros especificados como membros abstratos, membros selados, membros virtuais ou membros protegidos.