msdn15_capa.jpg

Clique aqui para ler todos os artigos desta edição

 

Chamada a todos os operadores

por Ken Getz

Este artigo discute

Este artigo usa as seguintes tecnologias:

·          Dicas e truques com operadores

Visual Basic. Net e C#

 

Download:

 

Chapéu

Operadores

 

 

Este mês encontrei uma pergunta interessante em minha caixa de correio. Era algo assim: "Estou escrevendo um código que trabalha com pontos e outros objetos de desenho em Visual Basic® 2003 e quero apenas adicionar um deslocamento a um ponto, para movê-lo. Tentei acrescentar um Size a um Point, mas a coisa não compila. Tentei fazer a mesma coisa em C# e funcionou muito bem. O que está havendo?"

Para definir o contexto, vale a pena criar algum código no Visual Studio® .NET 2003 para ver qual será o comportamento, antes de tentar uma solução (se você tentar isso no Visual Studio 2005, as coisas serão ligeiramente diferentes). Abra o Visual Basic .NET 2003, crie um novo aplicativo do Windows®, coloque um botão sobre o formulário, dê um duplo clique para entrar no code designer e acrescente o seguinte código ao handler de evento de Click do botão:

 

Dim pt As New Point(0, 0)

pt += New Size(10, 10)

 

Ele não compila, não é? Só por diversão, experimente fazer a mesma coisa, mas dessa vez escrevendo o código em C#:

 

Point pt = new Point(0, 0);

pt += new Size(10, 10);

 

Compilou corretamente, não foi? Eu poderia falar muito sobre por que funciona em C# e por que não funciona em Visual Basic .NET, mas a coisa toda se resume a um pequeno problema de projeto: o Visual Basic 2002 e o Visual Basic 2003 não suportam operadores sobrecarregados. Essas linguagens não podem criar ou consumir operadores que foram sobrecarregados, ou seja, operadores que parecem comuns, mas que têm comportamentos fora do padrão, definidos por um dos operandos do operador.

Se você analisar um pouco, concordará que qualquer operador, até mesmo os operadores simples + e -  trabalhando com inteiros, são apenas uma convenções tipográficas para métodos. Por exemplo, ao somar dois inteiros, em vez de escrever o código desta maneira

 

Dim x As Integer = a + b

 

você poderia imaginar que, nos bastidores, o computador está gerando um código como este:

 

Dim x As Integer = Int32.Add(a, b)

 

Desde que o operador seja definido pelo compilador, o Visual Basic 2002 e o Visual Basic 2003 se dão bem com isso. Por exemplo, você já pensou em usar o operador + com strings? Embora a maioria dos desenvolvedores não escreva códigos como este, é perfeitamente aceitável e funciona muito bem:

 

Dim str1 As String = "Hello, "

Dim str2 As String = "there"

Dim str3 As String = str1 + str2

 

Nos bastidores, o operador "+" com strings foi sobrecarregado para chamar o método String.Concat, convertendo aquela linha final do código em algo como:

 

Dim str3 As String = String.Concat(str1, str2)

 

Acredito que maioria das pessoas nem mesmo pensa nessas coisas, porque tudo é feito automaticamente pelo compilador, e isto torna as classes envolvidas mais intuitivas.

Agora vamos voltar à questão original. Como o C# suportava a sobrecarga de operadores desde o começo, e como há um procedimento escondido em algum lugar do código da estrutura do Point que sobrecarrega o operador + e aceita um Point e um Size como parâmetros, os desenvolvedores em C# podem usar o operador + para adicionar estruturas Point e Size, o que resulta em um novo Point em um novo local. Então, os desenvolvedores que usam o Visual Basic estarão na chuva se quiserem adicionar um Point e um Size? Não é bem assim.

Quando se usa o operador + na estrutura do Point ...

Quer ler esse conteúdo completo? Tenha acesso completo