.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
      Dim Telefone AS String
      Dim idade As Integer

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 :
  1. A palavra chave : Class iniciando a classe
  2. O nome da classe : Aluno
  3. A palavra-chave : End Class encerrando a 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:

  • Ambas podem implementar interfaces;
  • Ambas podem te construtores compartilhados, com ou sem parâmetros;
  • Ambos podem expor uma propriedade padrão, desde que a propriedade aceite pelo menos um parâmetro;
  • Ambas podem declarar e disparar eventos, e ambas podem declarar representantes;
  • 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
              Inherits Produtos
    End Class

    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
          Dim nome As String
    End Class

    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
        Dim Nome As String
       
     Public Sub New(ByVal nom)
           Nome = nom
        End Sub

    End Structure

    x Uma classe suporta o construtor padrão sem argumentos:

    Public Class Produtos
          Dim codigo As Integer
         
     Public Sub New()
          End Sub

    End Class

    O comportamento frente comparações usando o operador Equals

    Public Structure EstruturaPessoa
        Dim Nome As String
        Public Sub New(ByVal nom)
          Nome = nom
        End Sub
    End Structure
    ----------------------------------------

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim macoratti As EstruturaPessoa = New EstruturaPessoa("Macoratti")
    Dim mac As EstruturaPessoa = New EstruturaPessoa("Macoratti")

    If macoratti.Equals(mac) Then
         MsgBox("Macoratti é igual a Mac")
    Else
         MsgBox("Macoratti NÃO é igual a Mac")
    End If
    End Sub

    Resultado : Macoratti é igual a Mac" pois esta comparando valores por valor

    x O comportamento frente comparações usando o operador Equals

    Public Class ClassePessoa
        Dim Nome As String
        Public Sub New(ByVal nom)
           Nome = nom
        End Sub
    End Class
    --------------------------------------

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    Dim macoratti As ClassePessoa = New ClassePessoa("Macoratti")
    Dim mac As ClassePessoa = New ClassePessoa("Macoratti")

    If macoratti.Equals(mac) Then
        MsgBox("Macoratti é igual a Mac")
    Else
         MsgBox("Macoratti NÃO é igual a Mac")
    End If
    End Sub

    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:


    José Carlos Macoratti