Nada melhor para começar a série de polêmicas do que a maior polêmica do ambiente .Net: C# ou VB?

Antes de mais nada, quero contar para vocês que eu comecei no .Net com o VB. Espero que isso não influencie o post, mas se você achar que estou puxando a sardinha para o VB, já sabe: comente, reclame. Eu gosto muito das duas linguagens, e minhas certificações foram tiradas com as duas. Vou fazer um pouco o papel de advogado do diabo: vou dizer que VB é o máximo e que o C# fica para trás, e depois vou fazer o inverso, e vamos assim. E vou tocar tanto em aspectos de linguagem, quando na IDE, que na verdade, reflete muito a linguagem. Vamos lá:

O VB possui a maior base de programadores do mundo. Por esse motivo, a linguagem sempre vai receber muita atenção. O VB é feito para permitir que uma pessoa entusiasta por programação, mas não profissional, possa programar, sem ficar se preocupando com um monte de detalhes. Por exemplo, no VB, os métodos são sempre públicos por padrão e por isso um amador não teria que se preocupar com a visibilidade do método. Além disso, o VB se aproxima muito de linguagens dinâmicas, por permitir late binding, parâmetros opcionais, variáveis não tipadas (ou quase), etc… Tudo isso permite que você escreva o código muito mais rápido. E como a Microsoft sabe que muitos amadores usam VB, ela parece fazer uma experiência mais completa no Visual Studio primeiro no VB. É por isso, por exemplo, que o VB tem a compilação em background no VB desde 2002, e o C# só ganhou isso agora, 6 anos depois, o que obrigava o desenvolvedor a ficar compilando tudo, a cada mudança de 2 ou 3 linhas, se quisesse ter certeza de que tudo compilava direitinho.

A mesma vantagem que o VB traz, por ser mais flexível, é também uma desvantagem, afinal, é mais fácil errar com VB. Late binding pode ser algo muito perigoso. Em um ambiente profissional, eu geralmente recomendo que projetos em VB sempre estejam com Option Strict ON, aproximando do comportamento que é no C# é padrão. O C# tráz por default um ambiente mais profissional, menos sujeito a erros amadores. Mas com VB você pode resolver esse problema, como eu disse, ligando o Option Strict. E com isso, a linguagem passa a ter todo o profissionalismo que o C# tem. Ok, ponto para o VB, que permite trabalhar como amador, ou como profissional.

Por outro lado, esse estilo mais profissional do C# me agrada muito. É só um estilo, é verdade, mas, por exemplo, o fato de o “references” estar lá, fácil, no C#, e não estar no VB, é muito legal. Os amadores iam ficar confusos com esse tal de “references”, mas e os profissionais, como ficam?

image image

De repente poderíamos ter a opção do VB amador, e o VB profissional. Eu, por exemplo, não consigo trabalhar com os estilos de VB do Visual Studio:

image

A interface fica amadora demais, tudo fica escondido… Vou com a “General Development Settings” sempre.

Mas adoro o estilo declarativo de endereçar eventos do VB, com o Handles no final dos métodos. Eu não sei vocês, mas eu gosto muito de poder ligar eventos assim. Além do mais, se eu quiser remover o endereçador do evento depois, é só apagar o método, não preciso apagar também a declaração que liga o evento ao seu endereçador.

Mas o VB não tem refactor. Quer dizer, não por padrão, já que você pode baixar o VB Refactor, da Devexpress, que é de graça e é, na verdade, melhor que o Refactor do C#. Mas isso não faz muito diferença, já que a maioria nem usa refactoring pela ferramenta, ou usa quase nada (quando não usa só o Rename). Empatou.

E o C# é mais sucinto. Você escreve menos, e isso é muito legal. Só fica ruim de ler, às vezes, com aquele monte de chaves fechadas. Gera aquela dúvida… “Essa chave é do for, ou é do if?”. Aí os caras colocam aqueles comentários…

   10 static void Main(string[] args)

   11 {

   12 }//fim do main

Poxa, sé é para escrever “fim do main”, usa logo o VB… pelo menos ele termina com “End Sub”…

O VB tem uma outra vantagem: ele não é case sensitive. Isso te libera da preocupação do case da variável. Mas essa só é uma vantagem quando você começa a programar. Depois de uns anos, atrapalha muito, porque você tem uma bruta restrição nos nomes das variáveis, principalmente nas propriedades. Aí tem que ficar inventando nome para as variáveis e aparece cada absurdo:

   12 Private nomeDoCliente As String

   13 Public Property Nome() As String

   14     Get

   15         Return Me.nomeDoCliente

   16     End Get

   17     Set(ByVal value As String)

   18         Me.nomeDoCliente = value

   19     End Set

   20 End Property

Putz… “nomeDoCliente”? Que coisa horrorosa…

Ah, e por falar em propriedades, e as propriedades automáticas do C#? Eu adoro, é praticamente código auto-documentado. Se você coloca alguma identação ainda… fala se não fica bonito:

   14 public string       Nome                { get; set; }

   15 public int          Id                  { get; set; }

   16 public DateTime     DataDoCadastro      { get; set; }

   17 public string       Telefone            { get; set; }

   18 public string       Endereco            { get; set; }

Muito bom! Limpo, organizado, fácil de ler. Essa não tem comparação.

Quer dizer, quase, não é… já viram XML literals, que só tem no VB? Dêem uma olhada em um exemplo que usei na .Net Magazine, no artigo de VB 9:

   23 Dim pedidos1 = <?xml version="1.0" encoding="utf-8"?>

   24                <pedidos>

   25                    <pedido id="1" descricao="uma desc"/>

   26                    <pedido id="2" descricao="outra desc"/>

   27                    <pedido id="3" descricao="mais uma desc"/>

   28                </pedidos>

Meus amigos, isso é lindo. pedidos1 é uma variável do tipo System.Xml.Linq.XDocument. Sensacional! E é perfeita para usar no LINQ to XML, é claro. Tem todo o suporte de Intelisense, e permite essa sintaxe, que é de chorar de alegria:

   29 Dim p1 = From p In pedidos1.<pedidos>.<pedido> _

   30         Where CInt(p.@id) > 1

E esse então:

   32 Dim produtosXML = From p In db.Products _

   33           Select <produto>

   34                     <id><%= p.ProductID %></id>

   35                     <name><%= p.ProductName %></name>

   36                     <qtty><%= p.QuantityPerUnit %></qtty>

   37                 </produto>

Gera outro XDocument. Com C# isso dá um trabalho…

Uma coisa que gosto muito no C# é poder pular linhas, dar espaços, colocar o código onde eu quiser. No fim, coloco um ponto e vírgula e fica tudo certo. Já no VB preciso colocar aquele “_”. Na boa, não gosto. Não é “natural”.

E no C# as Lambdas ficam mais bonitas. Aquela sintaxe de “=>” (“goes to”, ou “vai para”) é o máximo. No VB fica tudo meio estranho. Nas duas demora um pouco para entender a primeira vez que você olha, e depois você acostuma com a sintaxe. Mas no C# é muito mais elegante. De longe. Vejam só:

   22 Action funcao = () => Console.WriteLine();

E essa então:

   25 void Teste()

   26 {

   27     Escreve((texto) => Console.WriteLine(texto));           

   28 }

   29 void Escreve(Action<string> acao)

   30 {

   31     acao("Hello world");

   32 }

É um exemplo simples, mas mostra a elegância do C#. Fala se é linha 27 não é uma coisa de louco? Muito legal.

Também gosto muito de poder, no C#, criar código inseguro e que chama direto as APIs de baixo nível. Sem precedentes no VB, até pela estrutura da linguagem, e sem dúvida algo muito poderoso. Ainda que pouquíssimo utilizado pela maioria, é uma possibilidade que gosto de ter à disposição se eu precisar.

Bom, se você leu até aqui, quero fazer uma conclusão, que acho que você já percebeu:

Não importa que linguagem você usa. C# é o máximo, e VB também é o máximo. E sabe porque? Porque as duas trabalham (e foram criadas para trabalhar) em conjunto com o .Net, que é o que as deixa poderosíssimas. Tem casos em que C# é melhor. Tem casos em que VB é melhor. Dêem uma olhada em um exemplo em que o Scott Hanselman mostra o impacto de escolher C# na hora errada. Já vi vários exemplos que mostram o oposto também, mas não me recordo agora de um link fácil. O que importa é escolher a melhor ferramenta para o trabalho. Sempre recomendo: aprenda as duas. Saiba usar as duas. E use cada uma com o que tem de melhor.

Finalizando, se você trabalha com C#, este post da MVP Kathleen Dollard é bem legal para quem está iniciando no VB. O interessante é que o primeiro item que ela coloca é “Passe por cima do seu problema com respeito (ao VB), ou desista antes de começar. O VB é uma ótima linguagem”. E se você trabalha com VB, dê uma boa olhada no C# (e ligue seu Option Strict). VB pode parecer mais fácil, mas acredite: VB e C# são dialetos de uma mesma lingua.

E você, o que acha? Prefere C# ou VB? Porque? Já parou para pensar no motivo? Já vi muitos desenvolvedores que querem dar ao C# um ar elitista, como se o VB fosse uma linguagem menor, e com certeza você também já viu (daí a Kathleen Dollard mencionar o respeito). O que acha disso?

E para fechar, colocando um pouco de pimenta: já viram o F#? Saiu uma nova versão de preview esse mês. Esse aí não é irmão, como o C# e o VB. É primo. E vai ter suporte, ao que tudo indica, no mesmo nível do VB e do C# (vamos poder criar aplicações web, console, etc). E lá vamos nós aprender uma nova tecnologia, quase do zero (já conhecemos o resto do .Net, certo?). TI é isso. Aprendizado constante.


Postado na(s) categoria(s) Polêmicas pelo giovanni bassi em 22 de setembro de 2008 às 23:01 | Tags: , , , ,

Comentários


setembro 23. 2008 09:01
Felipe Pessoto
Legal o post. Mas vou dizer que não gosto de VB.

Ele deixa as pessoas fazerem muita coisa errada. Outro dia fui converter a classe de VB pra C#, sei que usra um conversor não é a coisa mais inteligente, mas ok.

Apareceram 600 erros, e não eram por causa do conversor, e sim pq o VB deixou, e o programador que tb nao devia ter mta experiencia, fez coisas do tipo:

metodo (object MeuObjeto)
MeuObjeto.Response.Write("lalala")
end sub

Primeiro que mesmo em VB isso pode dar erro, como vc vai garantir que o que o kra te passou é um Page ou um UserControl? E no C# nem aceita isso é logico.

Outra coisa é que o VB deixa vc escrever um metodo sem os ()   int123.ToString
Fica menos legivel, vai saber se é metodo ou propriedade.

Os indices tb, são feitos com (), confunde com os metodos.

VB permite usar variaveis não inicializadas(tudo bem que ele iniciliza por tras).

Um negocio muito ruim tb, ele permite vc comparar um tipo por valor com null....
if int123 Is Nothing


É minha opiniao, posso estar meio traumatizado com o VB por ter pego codigos realmente mal feitos, mas prefiro nao usar VB mesmo.

http://blog.fujiy.net/http://blog.fujiy.net/


setembro 23. 2008 10:38
Giovanni Bassi
Felipe,
Você coloca características que podem ser prós ou contras, depende do seu foco. O late binding, que você colocou, eu também não gosto, por isso recomendo o option strict on, que resolve isso. Mas ajuda muito quem é amador.
O resto é sintaxe... os parênteses, é uma questão de estilo, e, também facilita para o amador. Eu tb prefiro que coloquem os parênteses, para ficar mais legível, mas acho que essa é uma questão menor. O mesmo vale para índices.
O VB permite utilizar variáveis de valor que são não inicializadas, como tipos primitivos (int, date, etc), ou structures. Classes ele permite mas gera um warning. No C# gera erro, é melhor.
Mas não permite comparar um tipo de valor com null. Essa sintaxe que você colocou vai gerar erro.
A maior parte dos erros que você mencionou são removidos com o option strict... o resto é sintaxe. Que tal usar o VB assim?

http://unplugged.giggio.net/http://unplugged.giggio.net/


setembro 23. 2008 12:10
Felipe Pessoto
É, o VB se bem programado é interessante, o problema é ele deixar os programadores fazerem essas coisas. E ai vc pega um codigo ruim e ta ferrado eheheh.

PS: Achei um codigo aqui, que compila:

Optional ByVal intCD As Int16 = Nothing
intCD = Nothing dentro de um iif

O compilador deve converter em 0, mas ai leva o programador ao erro. Nao tem como saber se a pessoa nao passou o parametro ou se passou um 0.

http://blog.fujiy.net/http://blog.fujiy.net/


setembro 23. 2008 13:52
Giovanni Bassi
É verdade, o "= nothing" funciona, é o "Is Nothing" que não funciona. O "Is" é um operador que só atua em objetos de referência, o igual atua nos 2...
O compilador já troca de cara o "Nothing" pelo 0, mas concordo que é ruim.
O Optional existe ainda mais por compatibilidade com o VB 6. Ninguém recomenda isso, principalmente porque vai dar trabalho para usar com C#...

No fim, sempre fica nas mãos do programador. Se ele sabe sai certo. A diferença é que um iniciante, com C#, pode empacar... Já com VB ele desempaca, mas pode fazer grandes besteiras.

http://unplugged.giggio.net/http://unplugged.giggio.net/


Brazil Henrique
setembro 25. 2008 18:46
Henrique
Gostei da parte que você falou que  "Já vi muitos desenvolvedores que querem dar ao C# um ar elitista," Realmente vi muito disso acontecendo.
Atualmente não tenho mais uma linguagem que eu ame!rs Trabalho conforme a necessidade! Smile

no site


setembro 27. 2008 09:29
Felipe Fujiy
Outra coisa que ja me deu um trabalho pra descobrir o bug foi o seguinte

metodolalala(int a)
metodolalala(string a)

object b = metodolalala(intParametro.ToString())


Isso tava gerando um erro.
Pq? Pois o VB faz conversoes automaticos, então neste caso era pra chamar o metodolalala(int a), (sim algum programador pegou um Int e transformou em string, pra usar um metodo que recebe um int) pois numa DLL antiga, apenas existia o metodolalala(int a). Ai o VB fazia e conversao pra Int automatica.

Quando criaram a sobrecarga com string, automaticamente ele passou a chamar o metodo com string, que fazia as coisas um pouco diferente, devia usar uma procedure que filtrava por nome, sei la. E ai como vc vai adivinhar que na verdade era pra chamar o outro método que em versoes antigas era usado conversao automatica?  Nem lembro como achei a solucao, acho que vi uma DLL antiga e nao tinha o metodo que recebia string e percebi.

http://fujiy.blogspot.com/http://fujiy.blogspot.com/


setembro 29. 2008 06:00
pingback
Pingback from pabloidz.wordpress.com

links for 2008-09-29 « pabloidz

http://pabloidz.wordpress.com/2008/09/29/links-for-2008-09-29/http://pabloidz.wordpress.com/2008/09/29/links-for-2008-09-29/


outubro 1. 2008 02:04
Giovanni Bassi
Felipe,
É, esse lance de conversões automáticas é jogo duro. Mais uma coisa resolvida com Option Strict.
Option Strict é o caminho para um desenvolvimento mais profissional em boa parte dos casos.
Tira um pouco do dinamismo da linguagem, mas linguagens dinamicas são uma faca de dois gumes: ajudam muito no começo, mas quando a aplicação cresce, se não foi bem utilizada, vai acabar te cortando...

http://unplugged.giggio.net/http://unplugged.giggio.net/


Brazil Guilherme Carvalho
abril 21. 2009 17:26
Guilherme Carvalho
Bom eu acho que a maioria utiliza o C# realmente por ser uma linguagem mais "profissional", entretando aqueles que jogam pedras no VB, no meu entendimento, está mais ligado a um preconceito que é comum no pessoal do Java, o tal do {} o ponto e vírgula, etc.

Uma linguagem que vem ganhando destaque e que não utiliza tais padrões é o Python, que se mostra uma linguagem fortemente tipada, alguns dizem até mais que o C# e que trabalha apenas com identação.

Para mim a melhor linguagem é a que atende da melhor forma as necessidades da minha aplicação.

no site


United States Alexandre Tarifa
julho 17. 2009 16:02
Alexandre Tarifa
Fantástico seu artigo Giggio, trabalho com C# e VB mas recentemente acabo usando mais C# por definição da empresa... quando trabalhava em consultoria, cada semana caia em um projeto com uma linguagem diferente... como sou MVP de VB já vi discussões com o time de VB como: ao criar um projeto em VB ter a opção: Legado e a opção Não legado, ou o que vc chamou de profissional ou amador, mas o fato é, um cara profissional de VB em 2 minutos e meio o torna profissional!

O linq to xml do VB é realmente sensacional!

Um ponto interessante, é que muitas coisas que vc cita que tem no C# como propriedades automáticas, a necessidade de _ no VB, no VB 10 está presentes!!! SENSACIONAL!!!

Bom eu gosto de VB e C# assim como gosto de PES 2009 e FIFA 2010 Smile

no site


julho 23. 2009 12:08
Betsey Johnson
Do you accept guest posts? I would love to write couple articles here.

http://discountwatchshop.biz/http://discountwatchshop.biz/


agosto 15. 2009 06:27
Invicta Mens Ii Collection
I am quite interesting in this topic hope you will elaborate more on it in future posts.

http://theluxurywatchstore.biz/invictat/invicta-mens-ii-collection-stainless-steel-tachymeter-bezel-watch-5781/http://theluxurywatchstore.biz/invictat/invicta-mens-ii-collection-stainless-steel-tachymeter-bezel-watch-5781/


agosto 17. 2009 03:45
Luminox Navy Seal Mens
I would like to add your blog to my blogroll please tell me what anchor should I use?

http://theswisswatch.biz/luminox/luminox-navy-seal-mens-dive-watch-with-rubber-band-blackkhaki/http://theswisswatch.biz/luminox/luminox-navy-seal-mens-dive-watch-with-rubber-band-blackkhaki/

Comentar


(Vai mostrar seu Gravatar)

  Country flag

biuquote
  • Comentário
  • Pré-visualização
Loading



Quem é Giovanni Bassi

Giovanni Bassi Sou uma pessoa apaixonada por tecnologia e especificamente por .Net. Sou consultor independente especialista em .Net, focado em arquitetura e melhores práticas. Tenho dezenas de artigos publicados na .Net Magazine, revista da qual sou editor técnico. Ministro palestras e cursos de vez em quando, e quando dá tempo eu respiro um pouco. Mais detalhes nesta página.

Busca

Selos

MVP

MCPD

MCSD

.Net Magazine

Abaixo ao if!

Calendário

«  fevereiro 2010  »
seteququsedo
25262728293031
1234567
891011121314
15161718192021
22232425262728
1234567
Ver detalhamento de posts no calendário

Blogs interessantes

    OPMLDownload OPML file

    Postagens recentes

    Comentários recentes

    Disclaimer / Aviso
    As opiniões colocadas neste blog são minhas e pessoais e não expressam necessariamente as opiniões de meus empregadores, pareceiros e amigos. Da mesma forma, os comentários feitos por leitores do blog não expressam a minha opinião.

    © Copyright 2010 .Net Unplugged
    Log in