Tuesday, January 23, 2007

Sobrecarga de Construtores em C#

Tenho muito mais experiência com a linguagem de programação Java do que tenho com o C#. Hoje quis fazer uma sobrecarga (overload) de um construtor em C#, mas a sintaxe correspondente do Java não funcionou. Por exemplo, seja a classe Ponto que armazena duas coordenadas reais e dois construtores, um padrão (sem argumentos) e outro inicializando as duas coordenadas. Uma forma de fazer isso em Java seria:

public class Ponto
{
public double X;
public double Y;
// Inicializa x e y
public Ponto(double x, double y) {
X = x; Y = y;
}
// Chama o construtor acima com x = 0 e y = 0
public Ponto() {
this(0,0);
}
}


Repare que no corpo do construtor Ponto(), usamos a expressão "this(0,0)". Em C#, a classe é praticamente igual, porém a forma de fazer a sobrecarga muda:

public class Ponto
{
public double X;
public double Y;
public Ponto(double x, double y)
{
X = x; Y = y;
}
public Ponto() : this(0, 0) { }
}


Observe que neste caso a expressão "this(0,0)" não fica no corpo do construtor padrão, mas sim antes corpo de texto numa seção de inicialização do construtor. Esta seção fica no espaço entre o caractere ':' e o início do corpo, delimitado pelos caracteres '{' e '}'. Apesar de a linguagem C# ser fortemente inspirada no Java, ela possui ligeiras e irritantes diferenças em relação ao seu modelo. A pior dessas diferenças é, em minha opinião, o modelo de eventos do C# que é extremamente complexo com funções delegadas e eventos. Neste quesito, o Java dá um banho em C#, mas esta já é uma outra história...

6 comments:

  1. E ae Sergio, blz? Esse post já é bem antigo, mas... vou responder assim mesmo; Não estou tomando partido dessa ou daquela linguagem, mas tanto JAVA quanto C# derivam do C++, este por sua vez deriva do C. Por isso há tanta semelhanças entre JAVA e C#, mas não é este último inspirado no primeiro. Abs

    ReplyDelete
  2. Olá Renan,

    Eu é que me desculpo pela demora em lhe responder. Vou tentar esclarecer meu ponto de vista: foi o Java que criou esse conceito de compilar o programa para um bytecode que é executado por uma máquina virtual, a JRE (Java Runtime Environment).

    Depois veio o C# com o mesmo conceito, mas chama a máquina virtual de CLR (Common Language Runtime). A única inovação neste quesito foi que mais do que uma linguagem pode ser compilada para o "bytecode" da CLR, mas a portabilidade foi totalmente esquecida pois todos rodam em Windows. Ou seja, em minha humilde opinião, é uma cópia sim, porém bem malfeita... :-)

    Saúde!
    Sergio Henrique

    ReplyDelete
  3. Olá Sérgio e Renan,

    Discordo de vocês pois o C# é uma evolução do C, C++, JAVA e DELPHI. Já desenvolvi nessas linguagens e posso afirmar que o C# pegou o melhor que cada linguagem podia ter. Enquanto o programa está em desenvolvimento o comportamento do C# é semelhante ao JAVA, mas ao executarmos a primeira vez, ele compila deixando de ser um programa interpretado para um executável diferente do JAVA que gera um bytecode. Mas adorei este artigo, pois conhecia esta sobrecarga no JAVA, mas não no C#. Parabéns.

    Abraços,
    André Vasconcelos

    ReplyDelete
  4. Olá André,

    Obrigado pelos comentários, acho que você tem razão nos seus argumentos exceto no que tange ao bytecode. Código Java não roda sem o runtime Java (JRE ou Java Runtime Environment) e código C# ou outra linguagem com link .NET não roda sem o runtime .Net (CLR ou Common Language Runtime). Seguem alguns links que suportam minha afirmação:

    http://portal.acm.org/citation.cfm?id=957341
    http://www.codeproject.com/KB/dotnet/clr.aspx
    http://www.itwriting.com/dotnet4.php

    Em suma, não se engane com o .EXE das aplicações compiladas via .NET, eles abrigam bytecode mesmo que é rodado dentro do ambiente CLR (.NET).

    Abração,
    Sergio Henrique

    ReplyDelete
  5. Gostei do artigo, pena que é preconceituoso.

    Não é porque o C# tem coisas diferentes do Java que ele tem diferenças "irritantes"...

    ReplyDelete
  6. Olá Junio,

    O espírito do post foi dar uma visão parcial mesmo, uma de programador Java que prefere sistemas abertos a outros fechados. Imagine como um torcedor São Paulino se referiria ao time do Corínthians, um do Vasco se referiria ao do Flamengo e assim por diante... :-)

    Saúde,
    Sergio Sousa

    ReplyDelete