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