linguagem VB.NET e nada: porque é do jeito que está?
-
06-07-2019 - |
Pergunta
Esta é uma pergunta sobre a linguagem VB.NET. Desde que eu estou usando-o todos os dias, eu apenas tentar compreender as motivações por trás de algumas de suas construções.
Eu só descobrir que esta linha:
If myObject Is Nothing then
é tão correta como este é:
If Nothing Is myObject Then
mesmos resultados. Usando ildasm, podemos ver que estas linhas são convertidas em:
if myObject = null then
e
if null = myObject then
Bem, mas, em VB.NET, você não pode escrever:
if myObject = Nothing Then
O compilador não vai aceitar isso.
Mmm, para mim, Se nada for myObject é muito mais menos óbvio do que Se myObject = Nada .
Por que autores VB.NET basta pensar o contrário? Qualquer dica?
Solução
O problema que você está correndo em é que VB.Net diferencia os 2 tipos de comparação de objetos. Ou seja referência e comparação Value.
O "é" operador em VB.Net é usada para comparação de referência. Isto pode ser utilizado quando os valores em causa são ambos os tipos de referência ou nullables. A tentativa de comparar os tipos de valor i desta forma irá resultar em um erro de compilação.
O "=" operador é usado para comparação Value. A comparação valor só pode ser usado em tipos que definem um = explícitas, <> par operador em sua definição de classe. A implementação real da igualdade depende da implementação do operador.
C # tem uma abordagem diferente em que ele usa == tanto para comparação de valor e referência. Que é usado é dependente de alguns fatores, incluindo o tipo dos valores que estão sendo comparados e a implementação de determinados métodos de igualdade.
Outras dicas
É uma dessas coisas herdadas de VB6 e COM. VB6 faz a distinção entre objectos de tipo de referência (que são instanciável) e tipos nativas, tais como int. tipos de referência tinha que ser criada e atribuída com o "Set" operador enquanto tipos nativos simplesmente usados ??"=".
Bem, em alguns casos, você pode escrever If myObject = Nothing Then
, mas não vai ser uma comparação nulo:
Dim someValue As Integer
If someValue = Nothing Then
' do something '
End If
O código acima é equivalente ao seguinte:
Dim someValue As Integer
If someValue = 0 Then
' do something '
End If
Neste caso, você tem um tipo de valor que tem seu valor "emtpy" (0 para um Integer
, Point.Empty
para uma estrutura Point
como exemplos). O É executa operador a comparação de referência (verificar se os objetos comparados são a mesma instância), enquanto o sinal de igual é a comparação de valor .
Outro pensamento é VB pretende ser mais detalhado se você olhar para alguns dos loop e sintaxe condicional. Um par de exemplos:
VB:
If x==0 Then
End If
While
End While
For i = 0 to 10 Step 2
Next i
C #
If x==0
{
}
While
{
}
for (int i = 0; i<=10;i+2)
{
}
Veja todas as palavras extras no código VB.Net? Essa é outra possível razão para a diferença.
O uso de Is Nothing
é uma construção que remonta aos dias de clássico Visual Basic (isto é, 6,0 e abaixo).
Para manter algum semblence de compatibilidade (assim como a maneira alças VB6 avaliação não-preguiçoso da declaração If
), este foi transportado para VB.NET.
Felizmente como ocdecio pontos fora, havia outros pecadilhos semelhantes que não foram transportados para VB.NET, tais como a declaração Set
para atribuir objetos para variáveis.