IsNothing versus Is Nothing


130

Alguém aqui usa o VB.NET e tem uma forte preferência a favor ou contra o uso IsNothing em oposição a Is Nothing(por exemplo, If IsNothing(anObject)ou If anObject Is Nothing...)? Se sim, por quê?

Edição: Se você acha que ambos são igualmente aceitáveis, você acha que é melhor escolher um e ficar com ele, ou é bom misturá-los?


3
um monte de boas razões para evitar o usoIsNothing()
KyleMit

@JesseChisholm, Há muito para um único comentário, mas meu comentário anterior postou este link para um artigo que enumera 5 diferentes blog.reneorban.com/2011/12/vbnet-isnothing-vs-is-nothing.html
KyleMit

As respostas tecnologia são realmente interessantes, mas é uma pena que a pergunta foi deixado um pouco demasiado aberto e gerou algumas respostas sem usar, basta cada vez mais vaga preferência pessoal
underscore_d

Respostas:


125

Se você der uma olhada no MSIL enquanto ele está sendo executado, verá que ele não é compilado exatamente no mesmo código. Quando você usa IsNothing (), na verdade, faz uma chamada para esse método, em vez de apenas avaliar a expressão.

A razão pela qual eu tenderia a usar "Is Nothing" é quando nego que se torne "IsNot Nothing" em vez de "Not IsNothing (objeto)", que eu pessoalmente sinto mais legível.


46

Acho que Patrick Steele respondeu melhor a essa pergunta em seu blog: Evitando IsNothing ()

Não copiei nenhuma resposta dele aqui, para garantir o crédito de Patrick Steele por seu cargo. Mas acho que, se você está tentando decidir se usa Is Nothing ou IsNothing, deve ler o post dele. Eu acho que você concorda que Is Nothing é a melhor escolha.

Editar - Comentário de VoteCoffe aqui

Conteúdo parcial do artigo: Depois de revisar mais código, descobri outro motivo para evitar o seguinte: Ele aceita tipos de valor! Obviamente, como IsNothing () é uma função que aceita um 'objeto', você pode passar o que quiser. Se for um tipo de valor, o .NET o colocará em um objeto e o passará para IsNothing - que sempre retornará false em um valor em caixa! O compilador VB.NET irá verificar a sintaxe do estilo "Is Nothing" e não será compilado se você tentar fazer um "Is Nothing" em um tipo de valor. Mas a função IsNothing () é compilada sem reclamações. -PSteele - VoteCoffee


7
Conteúdo parcial do artigo: Depois de revisar mais código, descobri outro motivo para evitar o seguinte: Ele aceita tipos de valor! Obviamente, como IsNothing () é uma função que aceita um 'objeto', você pode passar o que quiser. Se for um tipo de valor, o .NET o colocará em um objeto e o passará para IsNothing - que sempre retornará false em um valor em caixa! O compilador VB.NET irá verificar a sintaxe do estilo "Is Nothing" e não será compilado se você tentar fazer um "Is Nothing" em um tipo de valor. Mas a função IsNothing () é compilada sem reclamações. -PSteele
VoteCoffee

7
Publiquei alguns conteúdos, pois você nunca sabe se o link ficará inoperante e achei que acrescentou um bom ponto à cobertura.
VoteCoffee

33

Você deve absolutamente evitar o uso IsNothing()

Aqui estão 4 razões do artigo IsNothing () VS Is Nothing

  1. Mais importante, IsNothing(object)tudo passou para ele como um objeto, até tipos de valor! Como os tipos de valor não podem ser Nothing, é uma verificação completamente desperdiçada.
    Veja o seguinte exemplo:

    Dim i As Integer
    If IsNothing(i) Then
       ' Do something 
    End If

    Isso irá compilar e executar bem, enquanto isso:

    Dim i As Integer
    If i Is Nothing Then
        '   Do something 
    End If

    Não será compilado; o compilador gerará o erro:

    O operador 'Is' não aceita operandos do tipo 'Inteiro'.
    Os operandos devem ser de referência ou tipos anuláveis.

  2. IsNothing(object)é realmente parte de parte do Microsoft.VisualBasic.dll.
    Isso é indesejável, pois você tem uma dependência desnecessária da biblioteca VisualBasic.

  3. É lento - 33,76% mais lento de fato (mais de 1000000000 iterações)!

  4. Talvez preferência pessoal, mas IsNothing()parece uma Condição Yoda . Quando você olha para uma variável, está verificando seu estado, com ela como o assunto de sua investigação.

    ou seja, ele faz x? --- NÃO É xuma propriedade disso ?

    Então eu acho que If a IsNot Nothinglê melhor do queIf Not IsNothing(a)


29

Eu concordo com "Is Nothing". Como mencionado acima, é fácil negar com "IsNot Nothing".

Acho isso mais fácil de ler ...

If printDialog IsNot Nothing Then
    'blah
End If

que isso ...

If Not obj Is Nothing Then
    'blah
End If

5

O VB está cheio de coisas assim, tentando torná-lo "como inglês" e confortável para pessoas acostumadas a idiomas que usam () e {} muito. Por exemplo, no lado "like english" ... VB tem a palavra-chave " Ain't " ... e não, não estou brincando. E, por outro lado, como você provavelmente já sabe na maioria das vezes, pode usar () com chamadas de função, se quiser, mas não precisa.

Eu prefiro IsNothing () ... mas eu uso C e C #, então é exatamente isso que é confortável. E eu acho que é mais legível. Mas escolha o que lhe parecer mais confortável.


3
Seu link está inoperante, portanto, qual é o valor dele aqui: web.archive.org/web/20050308014055/http://ea.3leaf.com/2004/08/… No entanto, vale ressaltar que, ao contrário da crença popular, isso é Não é verdade.
precisa

5

Estou inclinado para a alternativa "Não é nada", principalmente porque parece mais OO.

Certamente o Visual Basic não possui a palavra-chave Ain't.


O VB.NET pode fazer métodos de extensão? :)
klkitchens

2

Também costumo usar a versão Is Nothing parcialmente de usá-la tanto quanto em SQL.


1

Inicialmente, usei o IsNothing, mas estou avançando no uso do Is Nothing em projetos mais recentes, principalmente para facilitar a leitura. A única vez em que fico com o IsNothing é se estou mantendo o código onde é usado o tempo todo e quero permanecer consistente.


-2

Is Nothing requer um objeto que foi atribuído ao valor Nothing. IsNothing () pode receber qualquer variável que não tenha sido inicializada, inclusive do tipo numérico. Isso é útil, por exemplo, ao testar se um parâmetro opcional foi passado.


Isto está errado. Tem certeza de que não entendeu errado? " IsNothing se destina a trabalhar em tipos de referência. Um tipo de valor não pode conter um valor Nothing e reverte para seu valor padrão se você atribuir Nothing [...] IsNothing sempre retorna False ". Mas "Representa o valor padrão de qualquer tipo de dado. [...] Para tipos de valor, [isso] depende se o tipo de valor é nulo." Então não é melhor? Nothing Is Nothing
Sublinhado_d
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.