Por Rafael Nascimento
rafabirth@hotmail.com
Rafael Nascimento é Microsoft Certified Professional e presta serviços de consultoria para projetos em .NET no Rio de Janeiro

Common Type System

Se você já desenvolveu algum código em Visual Basic 6 que consome uma Win32 API ou coponentes de terceiros você deve saber que os tipos de dados entre o Visual Basic 6 e outras linguagens (C, por exemplo) são diferentes. Se todo código .NET é transformado em IL e este deve ser chamado por outros programas em .NET, então há a necessidade de haver um sistema de tipos de dados comum para a representação de números inteiros, números reais, textos, entre outros. Os tipos de dados utilizados pelo .NET Framework são parte do Common Type System, um conjunto de regras para criação e utilização de tipos de dados.

 

O Common Type System é fundamental para garantir a integração entre as linguagens. Um desenvolvedor VB pode passar uma variável do tipo Int32 para uma biblioteca em escrita em C# sem problema algum, porque o tipo de dados Int32 está definido no Common Type System. O Common Type System torna seu programa mais seguro ao garantir a segurança dos tipos durante a execução. Isto significa que o seu programa não corre o risco de acessar um endereço de memória errado e que não está vulnerável a alguns ataques de segurança, como o memory lick.

 

O Visual Basic possui alguns tipos primitivos que mapeiam os novos tipos do Common Type System. Por exemplo, o tipo Integer aponta para o tipo System.Int32, um inteiro de 32 bits. O tipo String aponta para System.String, uma seqüência de caracteres Unicode. C# e outras linguagens possuem seus próprios tipos primitivos que apontam para seus respectivos tipos no Common Type System.

 

Note que, no Visual Basic 6, Integer é um inteiro de 16 bits e Long, um inteiro de 64 bits. No Visual Basic .NET, Decimal é um inteiro de 16 bits, Integer é um inteiro de 32 bits e Long, um inteiro de 64 bits.

 

Objetos e valores

 

Existem 2 tipos de dados no Common Type System: os tipos de referência e os tipos de valores. Estes 2 tips são fundamentalmente diferentes nos quesitos criação, uso de memória e destruição. Os tipos de valores se utilizam de dados que você considera primitivos: inteiro, string, boolean, entre outros. Os tipos de valores são normalmente simples de serem representados em memória, pois requerem poucos bytes. Quando estes tipos são passados como parâmetros de métodos (e transitam pela memória), seus valores são copiados em outro endereço de memória.

 

Tipos de valores são simples e eficientes. Para que sejam criados, eles não necessitam do mesmo tempo de processamento que os tipos de referência. E não precisam de nenhuma consideração especial para sua destruição. Os valores são colocados diretamente na pilha e amarrados à uma variável ou constante. O tempo de vida de um valor é o mesmo da variável usada para acessar este valor, e este não pode ser separado de sua variável. Ou seja, uma variável sempre tem um valor. Ao contrário dos tipos de referência, os tipos de valores não podem conter valor nulo (Nothing).

 

O Common Type System define os tipos de valores mais usuais (Integer, Boolean, Date, Char) e permite que você defina o seu próprio tipo também. Você pode, também, criar enumerações, que são tipos de dados customizados normalmente usados para dar nome a um conjunto de valores, normalmente inteiros. Somente os nomes definidos para os valores dentro da enumeração são válidos para suas variáveis. Por exemplo, o código abaixo mostra uma enumeração utilizada para tipos de usuários. Uma variável UserType só pode conter os 3 valores definidos na enumeração.

 

    Enum UserType As Integer

        Admin = 1

        Moderator = 2

        User = 3

    End Enum

 

O .NET Framework Class Library faz uso intenso de enumerações para tudo, de formas de I/O à cores.

 

Os tipos de referência são bastante diferentes. O "valor" deste tipo é o endereço de memória utilizado para referenciar uma instância do tipo de referência, ou seja, o objeto. Diferentemente dos tipos de valores, os tipos de referência não estão amarrados à um endereço de memória que contém o seu valor. O tipo de referência pode apontar para qualquer objeto alocado em memória, desde que seja do tipo apropriado. O tipo de referência pode, também, não referenciar nenhum objeto, tendo valor nulo (Nothing).

 

O CLR aloca espaço para objetos na sua pilha de memória de tempo de execução. Considere o código abaixo:

 

    conn = New SqlConnection(connectionString)

 

A variável conn está se referenciando a uma instância de uma nova SqlConnection. O objeto é criado na pilha. O CLR aloca memória para o novo objeto e chama um método especial do SqlConnection chamado construtor. O CLR tem, também, a responsabilidade de liberar memória e destruir os objetos que não estão mais em uso. Este tipo de ação é conhecido como garbage collection e é um dos principais serviços oferecidos pelo CLR.

 

Quando um tipo de referência é passado como parâmetro de um método, a referência é copiada para o método, e não o valor em si. O código chamador deste método e o método farão referência ao mesmo endereço de memória que contém o objeto. Se o método modifica o valor do objeto, este valor também muda para o código chamador. Considere o seguinte código:

 

    Sub CreateDataSet()

        Dim ds As New DataSet

        AddTable(ds)

        MsgBox(ds.Tables.Count.ToString())

    End Sub

    Sub AddTable(ByVal targetDataSet As DataSet)

        targetDataSet.Tables.Add("TableOne")

    End Sub

 

A variável ds é uma referência a um novo objeto DataSet que é passado como parâmetro para o método AddTable. Neste método, a variável targetDataSet é uma referência para o mesmo objeto DataSet. Depois, de volta ao método CreateDataSet, o objeto DataSet terá uma tabela em sua coleção de tabelas. Os 2 métodos estão trabalhando com o mesmo objeto, embora existam 2 variáveis diferentes em 2 métodos diferentes.

 

Classes, métodos, propriedades, campos e eventos

 

Na programação orientada a objetos, um objeto é uma instância de uma classe. Como desenvolvedor, você define uma classe com campos, propriedades, métodos e eventos. Depois, você cria objetos baseados nesta classe que possuem estado e comportamento. Considere a classe Form. Esta classe define os dados e as propriedades (Width, por exemplo) pra que uma janela seja mostrada em uma Windows Application. A classe Form também define o comportamento, como o método Show, que define a visualização de uma janela. No entanto, a classe Form não é um formulário. Esta classe define como um objeto proveniente de sua definição deve se comportar e se apresentar.

 

Uma classe possui 4 pilares: campos, métodos, propriedades e eventos. O campo é um valor que a classe pode conter. Um campo pode conter um valor diretamente (tipo de valor) ou uma referência para um endereço de memória contendo um valor (tipo de referência). Um campo em uma classe é análogo a uma variável em um método. O valor de uma variável em uma chamada de um método define o estado da chamada, ao mesmo tempo que a variável está amarrada àquela chamada do método. Da mesma forma, um campo faz parte do estado de um objeto (ou, a instância da classe).

 

Um método é uma unidade de funcionalidade de uma classe. Sub-rotinas (Subs) e funções (Functions), do Visual Basic, são métodos de uma classe. Os métodos são uma parte importante da comportamento de um objeto. Um método é um bloco de lógica de programação que é executado dentro do contexto do objeto e pode modificar o estado do mesmo, através de seus campos e propriedades.

 

A propriedade é a ponte entre os campos e os métodos. Como o campo, a propriedade faz parte do estado de um objeto. Para outros objetos, uma propriedade pública é o mesmo que um campo público,  e você usa, inclusive, a mesma sintaxe para ler e escrever dados nela. Mas, internamente, uma propriedade se resume a 2 métodos especiais: Get e Set. Quando você lê o valor de uma propriedade, o método Get é executado. Quando você escreve um valor em uma propriedade, o método Set é utilizado. A maior importância de uma propriedade é separar a interface pública de um objeto da representação interna de seus dados.

 

Eventos são fatos aos quais os objetos podem responder. Um evento é uma outra forma de comportamento que um objeto pode apresentar. Se um método é algo que um objeto pode fazer, um evento é algo que um objeto diz. Normalmente, eventos são utilizados para avisar aos objetos "ouvintes" que o estado daquele objeto foi modificado. Os objetos "ouvintes" são avisados das mudanças por meio de event handlers. O objeto "escutador" registra um método que representa uma espécie de alvo de um determinado evento de um objeto. Logo, aquele método é executado automaticamente quando o evento que ele representa ocorre. Um evento ocorre quando ele é explicitamente levantado por um objeto. Por exemplo, um objeto Button levanta o evento Click quando recebe uma mensagem do Windows dizendo que um botão padrão do mouse foi pressionado quando o cursor estava sobre o objeto. Desenvolvedores Visual Basic 6 encontrarão algumas diferenças no comportamento dos event handlers dentro do código gerenciado, mas há, porém, muitas similaridades entre os códigos escritos.

 

Quando você está escrevendo código gerenciado em Visual Basic, você está sempre criando classes, que são definições de tipos de dados. O estado e comportamento de um objeto daquele tipo é definido pelo seu código. O exemplo a seguir é uma classe chamada UserAddress. A classe tem 4 campos para conter os elementos de um endereço de postagem. Neste exemplo, todos os campos são definidos como Private, o que significa que eles não são acessíveis fora da classe. As propriedades da classe são expositores dos campos nela contidos. Ou seja, a interface pública da classe está separada de seus dados. Este exemplo também inclui um evento chamado AddressChanged. Cada método Set de cada propriedade da classe levanta este evento se o novo valor é diferente do valor atual. Objetos "ouvintes" podem registrar event handlers para este evento e executar métodos automaticamente. E, finalmente, existe um método chamado GetFormattedAddress, que cria uma variável String contendo todos os dados da classe.

 

Public Class UserAddress

    Private _address As String

    Private _city As String

    Private _provState As String

    Private _postalCode As String

    Public Event AddressChanged()

    Public Property Address() As String

        Get

            Return _address

        End Get

        Set(ByVal Value As String)

            If _address <> Value Then

                _address = Value

                RaiseEvent AddressChanged()

            End If

        End Set

    End Property

    Public Property City() As String

        Get

            Return _city

        End Get

        Set(ByVal Value As String)

            If _city <> Value Then

                _city = Value

                RaiseEvent AddressChanged()

            End If

        End Set

    End Property

    Public Property StateProvince() As String

        Get

            Return _provState

        End Get

        Set(ByVal Value As String)

            If _provState <> Value Then

                _provState = Value

                RaiseEvent AddressChanged()

            End If

        End Set

    End Property

    Public Property PostalCode() As String

        Get

            Return _postalCode

        End Get

        Set(ByVal Value As String)

            If _postalCode <> Value Then

                _postalCode = Value

                RaiseEvent AddressChanged()

            End If

        End Set

End Property

    Public Function GetFormattedAddress() As String

        Return _address + vbCrLf + _

        _city + ", " + _provState + vbCrLf + _

        _postalCode

    End Function

End Class

 

A classe UserAddress é um simples exemplo dos tipos de dados que você pode criar no Visual Basic. Construir aplicações com o .NET Framework é um processo de transformar requisitos em classes que interagem entre si para atingir determinados objetivos. Às vezes você deve criar suas classes por conta própria, como a classe UserAddress. Outras vezes, as classes são criadas automaticamente, quando, por exemplo, você adiciona um formulário na sua aplicação.

 

Qualquer coisa que você precise fazer na sua aplicação você vai fazer por meio de classes. Precisa de algo que represente um cliente? Crie uma classe. Precisa de funcionalidade para mover dados de uma base legada para uma base no SQL Server 2000? Crie uma classe. Se você desenhar as suas classes com o conceito de re-utilização, você vai, no futuro, se ver frente à um conjunto de classes que podem, simplesmente, ser copiadas para uma nova aplicação.

Dicas para quem está começando:
Veja os próximos eventos
que você não pode perder :

22/11/2008 SQL Launch -
Linhares - ES
Por : devASPNet


22/11/2008 SQL Launch- SQL Server 2008
Rio Paranaiba - Viçosa - MG
Por : devASPNet


22/11/2008 SQL Launch - SQL Server 2008
Volta Redonda - RJ
Por : devASPNet


22/11/2008 SQL Launch- SQL Server 2008
Franca - SP
Por : devASPNet


22/11/2008 SQL Launch - SQL Server 2008
Canoinhas - SC
Por : devASPNet


22/11/2008 SQL Launch - SQL Server 2008
Tefé - AM
Por : devASPNet


25/11/2008 SQL Launch - SQL Server 2008
Rio de Janeiro - RJ
Por : devASPNet


27/11/2008 SQL Lauch- SQL Server 2008
São Paulo - SP
Por : devASPNet


28/11/2008 SQL Launch - SQL Server 2008
São Paulo - SP
Por : devASPNet


29/11/2008 SQL Launch- SQL Server 2008
Pedro Leopoldo - MG
Por : devASPNet


29/11/2008 SQL Launch- SQL Server 2008
Petropolis - RJ
Por : devASPNet


29/11/2008 SQL Launch
Floriano - PI
Por : devASPNet


29/11/2008 SQL Launch - SQL Server 2008
Rio de Janeiro - RJ
Por : devASPNet


29/11/2008 SQL Launch - SQL Server 2008
Natal - RN
Por : devASPNet


29/11/2008 SQL Launch- SQL Server 2008
Santa Maria - RS
Por : devASPNet


29/11/2008 SQL Launch
Ituiutaba - MG
Por : devASPNet


5/12/2008 Cloud Computing e o Windows Azure
São Paulo - SP
Por : devASPNet


6/12/2008 SQL Server 2008 Community Launch
São Paulo - SP
Por : devASPNet

Leituras imperdíveis para quem está começando:

º Otimizando a performance no ASP.NET::..
º Criando objetos de paginação personalizados na grid::..
º Uma cesta de compras em ASP.NET::..
º Utilizando o Refresh de parâmetros no .NET::..
º ASP.NET FORMS Authentication::..
º Utilizando propriedades dinâmicas no .NET::..
º Corrigindo problemas de deleção em grid com paginação::..
º Cuidado com os componentes de validação::..
º Otimizando o InitializeComponent::..
º Movendo fonte de aplicações entre máquinas::..
º Agilizando a performance da IDE do VS.NET::..
º Utilizando Short Circuit no VB.NET::..


























  Parceiros:
20% de desconto para os membros do grupo na aquisição de livros e inscrição para eventos

Receba dicas de programação e programação .NET:
E-mail:
Incluir Excluir