Estruturas e classes (Visual Basic)

O Visual Basic unifica a sintaxe para estruturas e classes, com o resultado de que ambas as entidades dão suporte à maioria dos mesmos recursos. No entanto, também há diferenças importantes entre estruturas e classes.

As classes têm a vantagem de serem tipos de referência – passar uma referência é mais eficiente do que passar uma variável de estrutura com todos os seus dados. Por outro lado, as estruturas não exigem alocação de memória no heap global.

Como você não pode herdar de uma estrutura, as estruturas devem ser usadas apenas para objetos que não precisam ser estendidos. Use estruturas quando o objeto que você deseja criar tiver um tamanho de instância pequeno e leve em conta as características de desempenho de classes versus estruturas.

Semelhanças

Estruturas e classes são semelhantes nos seguintes aspectos:

  • Ambos são tipos de contêiner, o que significa que eles contêm outros tipos como membros.

  • Ambos têm membros, que podem incluir construtores, métodos, propriedades, campos, constantes, enumerações, eventos e manipuladores de eventos.

  • Os membros de ambos podem ter níveis de acesso individualizados. Por exemplo, um membro pode ser declarado Public e outro Private.

  • Ambos podem implementar interfaces.

  • Ambos podem ter construtores compartilhados, com ou sem parâmetros.

  • Ambos podem expor uma propriedade padrão, desde que essa propriedade tenha pelo menos um parâmetro.

  • Ambos podem declarar e gerar eventos, e ambos podem declarar delegados.

Diferenças

Estruturas e classes diferem nas seguintes particularidades:

  • Estruturas são tipos de valor e classes são tipos de referência. Uma variável de um tipo de estrutura contém os dados da estrutura, em vez de conter uma referência aos dados como um tipo de classe faz.

  • As estruturas usam alocação de heap; as classes usam alocação de heap.

  • Todos os elementos de estrutura são Public por padrão; variáveis de classe e constantes são Private por padrão, enquanto outros membros de classe estão Public por padrão. Esse comportamento para membros de classe fornece compatibilidade com o sistema de padrões do Visual Basic 6.0.

  • Uma estrutura deve ter pelo menos uma variável não compartilhada ou um elemento de evento não compartilhado e não compartilhado; uma classe pode estar completamente vazia.

  • Os elementos de estrutura não podem ser declarados como Protected; os membros da classe podem.

  • Um procedimento de estrutura só pode lidar com eventos se for um procedimento SharedSub e somente por meio da Instrução AddHandler; qualquer procedimento de classe pode lidar com eventos, usando a palavra-chave Handles ou a instrução AddHandler. Para obter mais informações, consulte Eventos.

  • As declarações de variável de estrutura não podem especificar inicializadores ou tamanhos iniciais para matrizes; as declarações de variável de classe podem.

  • As estruturas herdam implicitamente da classe System.ValueType e não podem herdar de nenhum outro tipo; as classes podem herdar de qualquer classe ou classes diferentes de System.ValueType.

  • As estruturas não são herdáveis; as classes são.

  • As estruturas nunca são encerradas, portanto, o CLR (common language runtime) nunca chama o método Finalize em qualquer estrutura; as classes são encerradas pelo GC (coletor de lixo), que chama Finalize em uma classe quando detecta que não há referências ativas restantes.

  • Uma estrutura não requer um construtor; uma classe sim.

  • As estruturas só poderão ter construtores não compartilhados se tiverem parâmetros; as classes podem tê-las com ou sem parâmetros.

Cada estrutura tem um construtor público implícito sem parâmetros. Esse construtor inicializa todos os elementos de dados da estrutura para seus valores padrão. Você não pode redefinir esse comportamento.

Instâncias e variáveis

Como as estruturas são tipos de valor, cada variável de estrutura está permanentemente associada a uma instância de estrutura individual. Mas as classes são tipos de referência e uma variável de objeto pode se referir a várias instâncias de classe em momentos diferentes. Essa distinção afeta o uso de estruturas e classes das seguintes maneiras:

  • Inicialização. Uma variável de estrutura inclui implicitamente uma inicialização dos elementos usando o construtor sem parâmetros da estrutura. Portanto, Dim s As struct1 é equivalente a Dim s As struct1 = New struct1().

  • Atribuição de variáveis. Quando você atribui uma variável de estrutura a outra ou passa uma instância de estrutura para um argumento de procedimento, os valores atuais de todos os elementos variáveis são copiados para a nova estrutura. Quando você atribui uma variável de objeto a outra ou passa uma variável de objeto para um procedimento, somente o ponteiro de referência é copiado.

  • Atribuição de Nothing. Você pode atribuir o valor Nothing a uma variável de estrutura, mas a instância continua a ser associada à variável. Você ainda pode chamar seus métodos e acessar seus elementos de dados, embora os elementos variáveis sejam reinicializados pela atribuição.

    Por outro lado, se você definir uma variável de objeto a Nothing, desassocie-a de qualquer instância de classe e não poderá acessar nenhum membro por meio da variável até atribuir outra instância a ela.

  • Várias instâncias. Uma variável de objeto pode ter instâncias de classe diferentes atribuídas a ela em momentos diferentes, e várias variáveis de objeto podem se referir à mesma instância de classe ao mesmo tempo. As alterações feitas nos valores dos membros da classe afetam esses membros quando acessados por meio de outra variável que aponta para a mesma instância.

    Os elementos de estrutura, no entanto, são isolados dentro de sua própria instância. As alterações em seus valores não são refletidas em nenhuma outra variável de estrutura, mesmo em outras instâncias da mesma declaração Structure.

  • Igualdade. O teste de igualdade de duas estruturas deve ser executado com um teste de elemento por elemento. Duas variáveis de objeto podem ser comparadas usando o método Equals. Equals indica se as duas variáveis apontam para a mesma instância.

Confira também