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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top