Eu não vi ninguém comentar sobre sua segunda pergunta explícita no final: "2: isso é convincente o suficiente para eu considerar a mudança para C # se o caso do VB.NET estiver de alguma forma limitando o que eu poderia fazer com o código?"
Eu prefiro a abordagem de mais opções que o C # permite que o programador escolha se limita as opções do programador. Eu prefiro o C #, mas apenas para a distinção entre maiúsculas e minúsculas, eu nem pensaria em aprender um idioma apenas porque é sensível a maiúsculas. todos os recursos são importantes e, quando observo as vantagens de ambos, C # e VB.NET, prefiro o C #. mas darei a você uma verdadeira perspectiva equilibrada, tendenciosa sim, porque tenho uma preferência, mas também serei honesto sobre as desvantagens do c #.
primeiro, os dois idiomas têm vantagens e desvantagens. as diferenças que você pode fazer em um idioma que não pode ser feito no outro estão diminuindo, pois, felizmente, a Microsoft está melhorando os dois idiomas, e eles parecem não estar mostrando parcialidade injusta em relação a um ou outro idioma.
quando o C # foi lançado, o VB não tinha seus comentários XML que você poderia colocar antes dos métodos, que eu adorava em C #. Eu odiava isso no VB.NET. mas vi ao longo dos anos que muitos recursos que não estão em um idioma são adicionados ao outro. (a mesma equipe de desenvolvedores da MS desenvolve C # e VB, portanto, faz sentido que os recursos se tornem bastante semelhantes.)
mas você perguntou o que o C # tem que o VB não tem. Aqui estão alguns em que consigo pensar imediatamente:
1: C # é mais conciso e leva menos digitação .. de muitas maneiras! Eu já vi estupidez falando quando a alegação oposta é feita, que o VB salva digitação. mas ouça as pessoas que lhe dizem que usam os dois idiomas e que raramente é usado por eles. eu uso ambos os c # eVB, C # em casa porque eu gosto (e quando trabalho com C # no trabalho) e minhas solicitações de trabalho mais recentes que eu uso VB e não C #. então, estou usando o VB com mais frequência agora (há cerca de 10 meses), mas, no meu testemunho pessoal, prefiro o C # e, em termos de digitação real, o VB é consideravelmente mais digitado. o exemplo que eu li onde alguém realmente tentou dizer que o VB era mais conciso, estava dando um exemplo 'with ...' com uma variável longa no with, então no VB, você poderia usar '.property'. isso é estupidez ao afirmar que o VB precisa de menos digitação. existem algumas coisas (e não apenas este exemplo) em que o VB é mais curto, mas muitas mais vezes quando o C # é mais conciso, na prática real.
mas a maior razão pela qual acredito que o C # é mais conciso, são as instruções "IF / THEN" do VB. se declarações são comuns. em C # não existe uma palavra 'then' para digitar! :) também todas as instruções 'end ...' recebem digitação, que em c #, geralmente é apenas uma chave de fechamento '}'. Eu li que algumas pessoas afirmam que essa maior verbosidade no VB.NET é uma vantagem para o VB, pois várias instruções / símbolos de bloco de fechamento podem ser aninhados e terminam imediatamente um ao lado do outro, mas discordo completamente. uma pessoa quase sempre pode escrever um programa melhor em C # ou VB do que outro programador, porque a próxima revisão de código poderia ser melhor projetada. isso se aplica aos 'confusos numerosos chavetas de fechamento em C #' mais se os blocos aninhados são todos do mesmo tipo, como vários IF's aninhados, o VB sofre o mesmo problema que em C #. isso não é uma vantagem no VB. Essa situação é precisamente a razão pela qual eu gostaria de comentar com o que meu símbolo ou declaração de fechamento se encaixa nos dois idiomas. sim, isso é mais detalhado, mas em qualquer idioma, você tem a opção de ser claro, o que é importante em casos específicos situacionais baseados em julgamento. Eu acho que a clareza do código é muito importante.
2: O VB não possui comentários de várias linhas. quando trabalhei com VB, não me importei. então eu fui para algumas linguagens no estilo C. agora estou de volta usando principalmente o VB.NET no trabalho e sinto falta deles. é apenas algo que você acha conveniente e precisa perder. :(
3: 'andalso' e 'orelse' do VB são bastante irritantes para digitar tudo isso quando, em C #, são simplesmente '&&' e '||'. novamente, menos digitação. isso não é raro no meu código em VB e C #. se alguma coisa, para funcionalidade, 'OR' vs 'OrElse' normalmente não importa, exceto que 'OrElse' é mais rápido para o computador, portanto, se um programador usar apenas 'Or' e 'And' no VB, ele produzirá um código menos ideal para alguém que gosta de clareza de código. 'Or' é muito mais fácil de deslizar do que 'OrElse'.
4: mais flexibilidade no posicionamento do código em C #. quando uma linha é longa e você deseja agrupá-la na próxima linha, eu odeio o 'controle' do VB.NET de reajuste do meu código. C # faz um pouco, mas acho mais útil em C #, onde no VB, é muito mais controlado. mas isso é mais do VB.NET IDE vs C # IDE do que da própria linguagem. mas não sei se você deseja os dois ou puramente os recursos de linguagem sem diferenças de IDE.
5: um que realmente sinto falta é apenas criar um novo bloco de código em C #, posso ter muita coisa acontecendo em um método e quero declarar uma variável em um bloco de código muito pequeno, mas não ter essa variável declarada fora desse bloco em o método inteiro. em C #, podemos apenas criar um novo bloco com '{' e finalizá-lo com '}'. O VB não possui esse recurso, mas a correspondência mais próxima é um bloco incondicional 'If True Then' e 'End If'. (observe o equivalente em VB.NET de 2 caracteres C # vs 18 caracteres novamente ... digitando mais em VB.)
6: auto incremento e operadores decremento: ++ e - como em myVariable++
ou ++myVariable
ou as versões decremento equivalentes. isso é muito útil ... às vezes. Aqui está um exemplo de código real quando eu perdi muito o C #:
// C#:
while (txt.Length > x)
{
thisChar = txt[x];
if (charsAllowedWithoutLimit.Contains(thisChar)) { ++x; }
else if (allowLettersWithoutLimit && char.IsLetter(thisChar)) { ++x; }
else if ((x2 = charsAllowedWithLimit.IndexOf(thisChar)) >= 0)
{
++x; if (++usedCountA[x2] > charAllowedLimit[x2]) { break; }
}
else { break; }
}
' VB.NET:
While (txt.Length > x)
thisChar = txt(x)
If (charsAllowedWithoutLimit.Contains(thisChar)) Then
x += 1
ElseIf (allowLettersWithoutLimit AndAlso Char.IsLetter(thisChar)) Then
x += 1
Else
x2 = charsAllowedWithLimit.IndexOf(thisChar)
If (x2 >= 0) Then
x += 1
usedCountA(x2) += 1S
If usedCountA(x2) > charAllowedLimit(x2) Then Exit While
Else
Exit While
End If
End If
End While
E só para dar um exemplo MUITO bom de regras de C #, esse é mais código que eu escrevi recentemente:
// C#
public static bool IsNotWithin(this Byte v, Byte v1, Byte v2) { return (v1 > v && v < v2) || (v2 < v && v > v1); }
public static bool IsNotWithin(this SByte v, SByte v1, SByte v2) { return (v1 > v && v < v2) || (v2 < v && v > v1); }
public static bool IsNotWithin(this Int16 v, Int16 v1, Int16 v2) { return (v1 > v && v < v2) || (v2 < v && v > v1); }
public static bool IsNotWithin(this Int32 v, Int32 v1, Int32 v2) { return (v1 > v && v < v2) || (v2 < v && v > v1); }
public static bool IsNotWithin(this Int64 v, Int64 v1, Int64 v2) { return (v1 > v && v < v2) || (v2 < v && v > v1); }
public static bool IsNotWithin(this UInt16 v, UInt16 v1, UInt16 v2) { return (v1 > v && v < v2) || (v2 < v && v > v1); }
public static bool IsNotWithin(this UInt32 v, UInt32 v1, UInt32 v2) { return (v1 > v && v < v2) || (v2 < v && v > v1); }
public static bool IsNotWithin(this UInt64 v, UInt64 v1, UInt64 v2) { return (v1 > v && v < v2) || (v2 < v && v > v1); }
public static bool IsNotWithin(this Decimal v, Decimal v1, Decimal v2) { return (v1 > v && v < v2) || (v2 < v && v > v1); }
public static bool IsWithin(this Byte v, Byte v1, Byte v2) { return (v1 <= v && v <= v2) || (v2 <= v && v <= v1); }
public static bool IsWithin(this SByte v, SByte v1, SByte v2) { return (v1 <= v && v <= v2) || (v2 <= v && v <= v1); }
public static bool IsWithin(this Int16 v, Int16 v1, Int16 v2) { return (v1 <= v && v <= v2) || (v2 <= v && v <= v1); }
public static bool IsWithin(this Int32 v, Int32 v1, Int32 v2) { return (v1 <= v && v <= v2) || (v2 <= v && v <= v1); }
public static bool IsWithin(this Int64 v, Int64 v1, Int64 v2) { return (v1 <= v && v <= v2) || (v2 <= v && v <= v1); }
public static bool IsWithin(this UInt16 v, UInt16 v1, UInt16 v2) { return (v1 <= v && v <= v2) || (v2 <= v && v <= v1); }
public static bool IsWithin(this UInt32 v, UInt32 v1, UInt32 v2) { return (v1 <= v && v <= v2) || (v2 <= v && v <= v1); }
public static bool IsWithin(this UInt64 v, UInt64 v1, UInt64 v2) { return (v1 <= v && v <= v2) || (v2 <= v && v <= v1); }
public static bool IsWithin(this Decimal v, Decimal v1, Decimal v2) { return (v1 <= v && v <= v2) || (v2 <= v && v <= v1); }
' And the VB equivalent is a mess! Here goes:
<Extension()>
Public Function IsNotWithin(v As Byte, value1 As Byte, value2 As Byte) As Boolean
Return (value1 > v AndAlso v < value2) OrElse (value2 < v AndAlso v > value1)
End Function
<Extension()>
Public Function IsNotWithin(v As SByte, value1 As SByte, value2 As SByte) As Boolean
Return (value1 > v AndAlso v < value2) OrElse (value2 < v AndAlso v > value1)
End Function
<Extension()>
Public Function IsNotWithin(v As Int16, value1 As Int16, value2 As Int16) As Boolean
Return (value1 > v AndAlso v < value2) OrElse (value2 < v AndAlso v > value1)
End Function
' the % suffix means 'As Integer' in VB.
<Extension()>
Public Function IsNotWithin(v%, value1%, value2%) As Boolean
Return (value1 > v AndAlso v < value2) OrElse (value2 < v AndAlso v > value1)
End Function
' the & suffix means 'As Long' in VB.
<Extension()>
Public Function IsNotWithin(v&, value1&, value2&) As Boolean
Return (value1 > v AndAlso v < value2) OrElse (value2 < v AndAlso v > value1)
End Function
<Extension()>
Public Function IsNotWithin(v As UInt16, value1 As UInt16, value2 As UInt16) As Boolean
Return (value1 > v AndAlso v < value2) OrElse (value2 < v AndAlso v > value1)
End Function
<Extension()>
Public Function IsNotWithin(v As UInt32, value1 As UInt32, value2 As UInt32) As Boolean
Return (value1 > v AndAlso v < value2) OrElse (value2 < v AndAlso v > value1)
End Function
<Extension()>
Public Function IsNotWithin(v As UInt64, value1 As UInt64, value2 As UInt64) As Boolean
Return (value1 > v AndAlso v < value2) OrElse (value2 < v AndAlso v > value1)
End Function
' the @ suffix means 'As Decimal' in VB.
<Extension()>
Public Function IsNotWithin(v@, value1@, value2@) As Boolean
Return (value1 > v AndAlso v < value2) OrElse (value2 < v AndAlso v > value1)
End Function
<Extension()>
Public Function IsWithin(v As Byte, value1 As Byte, value2 As Byte) As Boolean
Return (value1 <= v AndAlso v <= value2) OrElse (value2 <= v AndAlso v <= value1)
End Function
<Extension()>
Public Function IsWithin(v As SByte, value1 As SByte, value2 As SByte) As Boolean
Return (value1 <= v AndAlso v <= value2) OrElse (value2 <= v AndAlso v <= value1)
End Function
<Extension()>
Public Function IsWithin(v As Int16, value1 As Int16, value2 As Int16) As Boolean
Return (value1 <= v AndAlso v <= value2) OrElse (value2 <= v AndAlso v <= value1)
End Function
' the % suffix means 'As Integer' in VB.
<Extension()>
Public Function IsWithin(v%, value1%, value2%) As Boolean
Return (value1 <= v AndAlso v <= value2) OrElse (value2 <= v AndAlso v <= value1)
End Function
' the & suffix means 'As Long' in VB.
<Extension()>
Public Function IsWithin(v&, value1&, value2&) As Boolean
Return (value1 <= v AndAlso v <= value2) OrElse (value2 <= v AndAlso v <= value1)
End Function
<Extension()>
Public Function IsWithin(v As UInt16, value1 As UInt16, value2 As UInt16) As Boolean
Return (value1 <= v AndAlso v <= value2) OrElse (value2 <= v AndAlso v <= value1)
End Function
<Extension()>
Public Function IsWithin(v As UInt32, value1 As UInt32, value2 As UInt32) As Boolean
Return (value1 <= v AndAlso v <= value2) OrElse (value2 <= v AndAlso v <= value1)
End Function
<Extension()>
Public Function IsWithin(v As UInt64, value1 As UInt64, value2 As UInt64) As Boolean
Return (value1 <= v AndAlso v <= value2) OrElse (value2 <= v AndAlso v <= value1)
End Function
' the @ suffix means 'As Decimal' in VB.
<Extension()>
Public Function IsWithin(v@, value1@, value2@) As Boolean
Return (value1 <= v AndAlso v <= value2) OrElse (value2 <= v AndAlso v <= value1)
End Function
Talvez isso seja prova suficiente de que o C # é mais conciso. Mas nem todos os programadores gostam de concisão. Alguns preferem ler "se a <b então ..." porque é mais natural para a linguagem humana. E tudo bem. Preferências são boas. Para mim, o esforço manual é um fator que eu valorizo e acho que qualquer pessoa pode se acostumar a pensar nos símbolos de sua preferência, pois "if" e "then" são símbolos de um alfabeto e a declaração "if (condition)" do C #; " sintaxe também são símbolos. um está mais próximo da sintaxe de não programador do que o outro. Eu prefiro o conciso.
Também acho que a necessidade de usar 'c' após literais de caracteres no VB para torná-lo literal de caracteres, em vez de uma string, é irritante. Eu gosto da concisão do C # com muito mais. quando um método requer um literal de caractere, você precisa fornecer um caractere não uma string com um comprimento de caractere; portanto, às vezes você é forçado a usar ":"c
no VB enquanto estiver no C # ':'
. Eu acho que isso é nit-picking tho.
Para ser justo, eu vou dizer que há vantagens i gostam de VB como não ter de colocar parênteses vazios depois de chamadas de método, como Dim nameUpper$ = name.ToUpperInvariant
em C # requer os parênteses vazios: string nameUpper = name.ToUpperInvariant()
. ou o dobro que, como aparar também: Dim nameUpper$ = name.Trim.ToUpperInvariant
vs string nameUpper = name.Trim().ToUpperInvariant()
. Eu gosto do uso conciso do VB de como eu acabei de usar $
acima para escurecer 'As String', onde o C # não possui esses atalhos. O VB possui esses atalhos para os tipos String, Inteiro, Longo, Decimal, Único e Duplo, mas a desvantagem é que é menos claro, então eu o uso com cautela. mas, no entanto, prefiro código conciso.
Bem, isso é apenas alguns pontos deste programador experiente e, como eu considero, este é o meu 'testemunho' de programação de C # vs VB. ambos são bons idiomas, na minha opinião. mas sim, eu ainda prefiro muito o c #.
ps Como planejo programar a maior parte da minha vida, aprendi a digitar usando o teclado mais eficiente: o teclado Dvorak, que leva cerca de 1/3 do esforço para digitar inglês do que em um teclado Qwerty. procure. talvez você queira mudar também. ;) tornou minha digitação 67% mais fácil! :) Encorajo qualquer pessoa a pensar fora da caixa e avaliar melhor eficiência no seu trabalho. O layout do teclado simplificado e o C # do Dvorak fizeram isso por mim. :)
PSS: eu compararia o Dvorak e o C # à métrica em oposição ao layout do teclado Qwerty e o VB às medidas empíricas. Dvorak, métrica e C # são apenas 'limpos'. Mas o VB não está muito atrás. Mas sofre com a necessidade de ser compatível com versões anteriores do código VB6 antigo e do código .NET anterior, como 'Or' vs 'OrElse' e 'IIF ()'.
Termino com cautela. Por favor, seja mais prudente do que ouvir pessoas que realmente não sabem do que estão falando. Metade de todos os contras contra VB e C # não sãomais qualquer problema, e as pessoas ainda postam sobre eles serem ignorantes sobre quais desvantagens realmente ainda existem no idioma. O melhor exemplo que consigo pensar é em comentários XML para métodos que usam apóstrofo triplo em VB ou símbolos de comentário de barra tripla em C #. Mas discuta por si mesmo se uma pessoa está falando por ignorância ou por experiência. Testemunho pessoal significa que eles sabem de sua experiência real. E depois que alguém tiver muita experiência, então anime seus ouvidos. Tenho mais de 10 anos de experiência em C # e VB. E tudo se resume a isso: ambas são (muito) boas linguagens. E a maioria das diferenças, você pode ver imediatamente dentro de 5 minutos após a leitura do código. Mas sim, outros recursos podem levar anos para encontrar uma desvantagem. E uma desvantagem que eu conheço (em C #), eu posso ' nem pense em uma situação da vida real onde seria útil. Portanto, talvez não seja uma desvantagem, afinal.
Feliz codificação!