TOC

This article has been localized into Portuguese by the community.

Tópicos avançados:

Structs

O C# struct é uma alternativa leve para uma classe. Ele pode fazer quase o mesmo que uma classe, mas é menos "caro" usar uma struct do que uma classe. A razão para isso é um pouco técnica, mas para resumir, novas instâncias de uma classe são colocadas no heap, onde estruturas recém-instanciadas são colocadas na pilha. Além disso, você não está lidando com referências a estruturas, como com classes, mas ao invés disso você está trabalhando diretamente com a instância struct. Isso também significa que quando você passa uma estrutura para uma função, ela é por valor, em vez de como referência. Há mais sobre isso no capítulo sobre parâmetros de função.

Portanto, você deve usar estruturas quando desejar representar estruturas de dados mais simples e, especialmente, se souber que estará instanciando muitas delas. Há muitos exemplos na estrutura .NET, onde a Microsoft usou estruturas em vez de classes, por exemplo, a estrutura Point, Rectangle e Color.

Primeiro, gostaria de mostrar um exemplo de uso de uma estrutura e, em seguida, discutiremos algumas das limitações de usá-las em vez de classes:

class Program
{
    static void Main(string[] args)
    {
        Car car;

        car = new Car("Blue");
        Console.WriteLine(car.Describe());

        car = new Car("Red");
        Console.WriteLine(car.Describe());

        Console.ReadKey();
    }
}

struct Car
{
    private string color;

    public Car(string color)
    {
        this.color = color;
    }

    public string Describe()
    {
        return "This car is " + Color;
    }

    public string Color
    {
        get { return color; }
        set { color = value; }
    }
}

O leitor observador notará que este é o mesmo código de exemplo usado na introdução às classes, além da mudança de uma classe para uma estrutura. Isso mostra como os dois conceitos são semelhantes. Mas como eles diferem, além dos detalhes técnicos mencionados no início deste capítulo?

Primeiro de tudo, os campos não podem ter inicializadores, o que significa que você não pode declarar um membro assim:

private string color = "Blue";

Se você declarar um construtor, todos os campos devem ser atribuídos antes de deixar o construtor. Um struct vem com um construtor padrão, mas assim que você escolhe definir o seu próprio, você concorda em inicializar todos os campos nele. Isso também significa que você não pode declarar seu próprio construtor sem parâmetros - todos os construtores de struct precisam ter pelo menos um parâmetro. Em nosso exemplo acima, de fato, atribuímos um valor ao campo de cores. Se não tivéssemos feito isso, o compilador iria reclamar.

Uma struct não pode herdar de outras classes ou estruturas, e as classes não podem herdar de structs. Uma struct herda da classe Object, mas é isso para herança e structs. Eles suportam interfaces, o que significa que suas estruturas podem implementar interfaces personalizadas.


This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!