Qual a diferença entre Struct e Class?

A diferença fundamental entre um Struct e uma Class em linguagens de programação orientadas a objetos, como C# ou Java, está na forma como são tratados em relação à alocação de memória e passagem de valores.

Uma Struct é um tipo de valor, enquanto uma Class é um tipo de referência.

Isso significa que, ao criar uma instância de uma Struct, a memória é alocada no stack e os valores são copiados para lá. Em contrapartida, ao criar uma instância de uma Class, a memória é alocada no heap e um ponteiro (ou referência) para esse objeto é armazenado no stack.

Uma diferença prática entre Structs e Classes é que, por serem valores, Structs são comparadas quanto aos seus valores, enquanto Classes são comparadas quanto às suas referências. Isso significa que duas Structs com os mesmos valores em cada campo serão consideradas iguais, enquanto duas Classes com o mesmo estado serão consideradas diferentes, a menos que você implemente a comparação personalizada na sobrecarga do método Equals().

Outra diferença importante é que Structs não suportam herança, enquanto Classes suportam. Ou seja, você pode criar uma hierarquia de classes onde uma classe base define características e comportamentos comuns, e as classes derivadas herdam e podem estender essas características e comportamentos.

Um exemplo prático dessa diferença pode ser observado em um sistema de cadastro de produtos. Se você estiver usando uma Struct para representar um produto, e tiver uma necessidade de atualizar alguma informação desse produto, você precisaria criar uma nova instância da Struct com os valores atualizados. Por outro lado, se você estiver usando uma Classe para representar um produto, você poderia simplesmente atualizar os valores dos campos da instância existente.

Em resumo, a escolha entre Struct e Class depende do cenário em que você está trabalhando. Use Structs quando precisar de tipos de valor simples, pequenos e imutáveis, e Classes quando precisar de tipos de referência que possam ser atualizados ou herdados.