.NET - Diferenças entre Estruturas e Classes
Você sabe me dizer qual a diferença ou diferenças entre as estruturas e as classes ? |
Se ainda não caiu a ficha vou dar o conceito resumido sobre estes dois recursos da plataforma .NET para depois entrar nas diferenças entre ambas.
O que são estruturas ?
Uma estrutura na linguagem VB .NET é simplesmente uma composição de tipos de dados composta de elementos de outros tipos. Uma estrutura pode conter campos, métodos, constantes , construtores, propriedades, indexadores, operadores e mesmo outro tipos de estruturas.
Uma estrutura é considerado um Tipo por Valor e instâncias ou objetos de uma estrutura são criadas na memória STACK.
A seguir temos um exemplo de definição de
uma estrutura no VB.NET:
Public Structure Clientes
Dim Nome AS String End Structure |
O código declara uma estrutura do tipo
Public , por isso , pode ser colocado em
qualquer lugar do arquivo , exceto dentro de funções ou
rotinas.
Se a estrutura for Private podemos colocar o código dentro de
uma classe
ou módulo.
Feito isto é só usar a estrutura e criar um
objeto do tipo Clientes em qualquer lugar do nosso código e
atribuir as informações :
Dim Paulo As Clientes Paulo.Nome = "Paulo da Silva" Paulo.Telefone = "18-123456" |
Observe que estamos criando uma instância da estrutura sem usar o operador new mas também podemos usar este operador:
Dim Paulo As new
Clientes
Paulo.Nome =
"Paulo da Silva"
Paulo.Telefone = "18-123456"
O que são Classes ?
As classes são o foco principal das linguagens orientada a objetos, e, em uma classe temos um tipo de dados que oferece alguma funcionalidade.
Uma classe é uma estrutura de dados que pode conter campos e constantes, métodos, propriedades, eventos, operadores, construtores e destrutores.
As classes são tipos e os objetos são instâncias das classes. A classe funciona como um modelo, uma planta a partir da qual são criados os objetos.
No VB.NET uma classe é declarada usando a palavra-chave : Class
Class Aluno End Class |
Temos ao
lado a estrutura básica de uma classe :
|
Para começar a
trabalhar com uma classe incluindo-a em um projeto VB.NET ,
primeiro temos que criar um projeto do tipo
Windows
Application, Console, Web ou WPF
e selecionar no menu
Project|Add
Class .
Será incluído em
seu projeto um arquivo padrão com o nome de
Class1.vb (a extensão
.vb
também refere-se a arquivos para formulário, modulo , etc...),
em
seguida basta definir o nome do arquivo e a definição da
classe.
Nota1
: A notação recomendada
para dar nome a uma classe é a seguinte : O primeiro caracter do
nome da classe deve estar em caixa alta ; assim também como cada
primeiro caractere de uma palavra concatenada para formar o nome
da classe. Ex:
CalculaSalario
, EnviaArquivoTexto , etc..
Para criar uma instância da classe usamos o operador new: Dim aluno as new Aluno
O código acima cria o objeto aluno como uma instância da classe Aluno.
As classes são consideradas um Tipo por Referência e são colocadas no Heap.
Elas tem em comum as seguintes propriedades:
Diferenças entre Estruturas e Classes
De forma sucinta e objetiva podemos elencar as seguintes diferenças entre Estruturas e Classes:
Estruturas | X | Classes |
As estruturas são Tipos por Valor e são armazenadas na Stack. (Usar a palavra chave new não altera este comportamento.) | x | As classes são Tipos por referência e são armazenadas na Heap |
Uma estrutura não pode ser herdada ou seja não suporta a cláusula Inherits | x | Uma classe pode ser herdada
usando a cláusula Inherits
Public Class Brinquedos |
Uma estrutura não pode ser abstrata ou seja não suporta a cláusula MustInherits | x | Uma
classe pode ser abstrata usando a cláusula Mustinherits
Public MustInherit Class
Produtos |
Uma estrutura
não pode ter
um construtor sem argumentos ou construtor padrão. Uma estrutura suporta somente um construtor com argumentos: Public
Structure Clientes |
x | Uma classe suporta o
construtor padrão sem argumentos:
Public Class Produtos |
O
comportamento frente comparações usando o operador
Equals Public
Structure EstruturaPessoa Private Sub
Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click Resultado : Macoratti é igual a Mac" pois esta comparando valores por valor |
x | O
comportamento frente comparações usando o operador
Equals Public
Class ClassePessoa Private Sub
Button2_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button2.Click Resultado: Macoratti NÃO é igual a Mac pois esta comparando referências. |
Elementos de uma estrutura NÃO podem ser declarados como Protected | x | Elementos de uma classe podem ser declarados como Protected |
Estruturas não são nunca finalizadas, portanto, a Common Language Runtime (CLR) nunca chama o método Finalize em qualquer estrutura; | x | Classes são
finalizadas pelo coletor de lixo (GC), que chama Finalize
em uma classe quando ele detecta que não á referências
ativas restantes. |
Todos os elementos de estrutura são Public por padrão; | x | Variáveis de classe e constantes são Private por padrão, enquanto outros membros da classe são Public por padrão |
Em geral, as classes são usadas para modelar um comportamento mais complexo ou dados que se destinam a ser Modificado depois de criado em um objeto de classe. | x | As
estruturas são mais adequadas para as estruturas de
dados pequenas que contêm principalmente os dados e que
não é se destina a ser modificada depois que a
estrutura é criada. |
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áveis são copiados para a nova estrutura | x | Quando você atribui uma
variável de objeto a outra, ou passa um variável de
objeto para um procedimento,
somente o ponteiro de referência é copiado. |
Você pode atribuir o valor Nothing (Visual Basic) a uma variável de estrutura, mas a instância continuará a ser associada à variável.Você ainda poderá chamar seus métodos e acessar seus elementos de dados, embora os elementos de variável sejam reinicializados pela atribuição. | X | Se você definir um variável de objeto como Nothing, você o dissocia de qualquer instância de classe, você não pode acessar todos os membros através da variável até que você atribua uma outra instância a ela. |
Dessa forma quando necessitarmos de tipos mais leves podemos armazená-lo na pilha através do uso de estruturas.
Com isso espero que tenha ficado claro as diferenças entre classe e estrutura na linguagem VB .NET.
Eu sei é apenas .NET, mas eu gosto...
Referências: