Estruturas e classes (Visual Basic)
Visual Basic unifica a sintaxe para estruturas e classes, com o resultado de que ambas as entidades suportam a maioria dos mesmos recursos. No entanto, existem também 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 requerem alocação de memória na pilha 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 consideração as características de desempenho de classes versus estruturas.
Semelhanças
As estruturas e classes são semelhantes nos seguintes aspetos:
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 outroPrivate
.Ambos podem implementar interfaces.
Ambos podem ter construtores compartilhados, com ou sem parâmetros.
Ambos podem expor uma propriedade padrão, desde que a propriedade use pelo menos um parâmetro.
Ambos podem declarar e gerar eventos, e ambos podem declarar delegados.
Differences
As estruturas e classes diferem nos seguintes elementos:
Estruturas são tipos de valor, 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.
As estruturas utilizam alocação de pilha; as classes usam alocação de pilha.
Todos os elementos da estrutura são
Public
por padrão, variáveis de classe e constantes sãoPrivate
por padrão, enquanto outros membros da classe sãoPublic
por padrão. Esse comportamento para membros de classe fornece compatibilidade com o sistema Visual Basic 6.0 de padrões.Uma estrutura deve ter pelo menos uma variável não compartilhada ou um elemento de evento não compartilhado e não personalizado; Uma classe pode estar completamente vazia.
Os elementos da estrutura não podem ser declarados como
Protected
; os membros da classe podem.Um procedimento de estrutura pode manipular eventos somente se for um procedimento compartilhado
Sub
, e somente por meio da instrução AddHandler, qualquer procedimento de classe pode manipular eventos, usando a palavra-chave Handles ou aAddHandler
instrução. Para obter mais informações, consulte Eventos.As declarações de variáveis de estrutura não podem especificar inicializadores ou tamanhos iniciais para matrizes; declarações de variáveis de classe podem.
As estruturas herdam implicitamente da System.ValueType classe 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 hereditárias; as aulas são.
As estruturas nunca são encerradas, então o Common Language Runtime (CLR) nunca chama o Finalize método em nenhuma estrutura, as classes são encerradas pelo coletor de lixo (GC), que chama Finalize uma classe quando deteta que não há referências ativas restantes.
Uma estrutura não requer um construtor; uma classe faz.
As estruturas só podem ter construtores não partilhados se tomarem parâmetros; as classes podem tê-los com ou sem parâmetros.
Toda estrutura tem um construtor público implícito sem parâmetros. Este construtor inicializa todos os elementos de dados da estrutura para seus valores padrão. Não é possível redefinir esse comportamento.
Instâncias e variáveis
Como as estruturas são tipos de valor, cada variável de estrutura está permanentemente ligada 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 aDim 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 de variável 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.
Não atribuindo nada. 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 como
Nothing
, a dissociará 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 diferentes instâncias de classe 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 da estrutura, no entanto, são isolados dentro de sua própria instância. As alterações aos seus valores não se refletem em quaisquer outras variáveis de estrutura, mesmo noutras instâncias da mesma
Structure
declaração.Igualdade. O teste de igualdade de duas estruturas deve ser realizado com um teste elemento a elemento. Duas variáveis de objeto podem ser comparadas usando o Equals método. Equals Indica se as duas variáveis apontam para a mesma instância.