Nic nie jest kontra Jest niczym

130

Czy ktoś tutaj używa VB.NET i zdecydowanie preferuje lub nie używa IsNothingw przeciwieństwie do Is Nothing(na przykład If IsNothing(anObject)lub If anObject Is Nothing...)? Jeśli tak, dlaczego?

EDYCJA: Jeśli uważasz, że oba są równie akceptowalne, czy uważasz, że najlepiej wybrać jeden i trzymać się go, czy też można je mieszać?

Luke Girvin
źródło
3
Istnieje wiele dobrych powodów, aby unikać używaniaIsNothing()
KyleMit
@JesseChisholm, jest za dużo na jeden komentarz, ale mój poprzedni komentarz zawierał
KyleMit
Odpowiedzi techniczne są naprawdę interesujące, ale szkoda, że ​​pytanie zostało nieco zbyt otwarte i wygenerowało kilka odpowiedzi bezużytecznych, tylko coraz bardziej niejasne osobiste preferencje
podkreślenie_d

Odpowiedzi:

125

Jeśli spojrzysz na MSIL podczas wykonywania, zobaczysz, że nie kompiluje się do dokładnie tego samego kodu. Kiedy używasz IsNothing (), w rzeczywistości wywołuje tę metodę, a nie tylko ocenia wyrażenie.

Powodem, dla którego skłaniałbym się do używania „Is Nothing” jest to, że kiedy zaprzeczam, staje się „IsNot Nothing” zamiast „Not IsNothing (obiekt)”, co osobiście wydaje mi się bardziej czytelne.

lomaxx
źródło
46

Uważam, że Patrick Steele najlepiej odpowiedział na to pytanie na swoim blogu: Unikanie niczego ()

Nie skopiowałem tutaj żadnej z jego odpowiedzi, aby upewnić się, że Patrick Steele jest uznany za jego stanowisko. Ale myślę, że jeśli próbujesz zdecydować, czy użyć Is Nothing czy IsNothing, powinieneś przeczytać jego post. Myślę, że zgodzisz się, że Is Nothing to najlepszy wybór.

Edytuj - tutaj komentarz VoteCoffe

Częściowa treść artykułu: Po przejrzeniu większej ilości kodu znalazłem inny powód, dla którego powinieneś tego unikać: akceptuje typy wartości! Oczywiście, ponieważ IsNothing () jest funkcją, która akceptuje „obiekt”, możesz przekazać do niej wszystko, co chcesz. Jeśli jest to typ wartości, .NET umieści go w obiekcie i przekaże do IsNothing - co zawsze zwróci false w przypadku wartości pudełkowej! Kompilator VB.NET sprawdzi składnię stylu „Is Nothing” i nie będzie kompilował, jeśli spróbujesz wykonać operację „Is Nothing” na typie wartości. Ale funkcja IsNothing () kompiluje się bez skarg. -PSteele - VoteCoffee

Jack Snipes
źródło
7
Częściowa treść artykułu: Po przejrzeniu większej ilości kodu znalazłem inny powód, dla którego powinieneś tego unikać: akceptuje typy wartości! Oczywiście, ponieważ IsNothing () jest funkcją, która akceptuje „obiekt”, możesz przekazać do niej wszystko, co chcesz. Jeśli jest to typ wartości, .NET umieści go w obiekcie i przekaże do IsNothing - co zawsze zwróci false w przypadku wartości pudełkowej! Kompilator VB.NET sprawdzi składnię stylu „Is Nothing” i nie będzie kompilował, jeśli spróbujesz wykonać operację „Is Nothing” na typie wartości. Ale funkcja IsNothing () kompiluje się bez skarg. -PSteele
VoteCoffee
7
Opublikowałem część treści, ponieważ nigdy nie wiesz, czy link zniknie, i pomyślałem, że to dobry punkt na okładkę.
VoteCoffee
33

Należy bezwzględnie unikać używania IsNothing()

Oto 4 powody z artykułu IsNothing () VS Is Nothing

  1. Co najważniejsze, IsNothing(object)wszystko zostało przekazane do niego jako obiekt, nawet typy wartości! Ponieważ typy wartości nie mogą być Nothing, jest to całkowicie zmarnowany czek.
    Weźmy następujący przykład:

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

    To się skompiluje i będzie działać dobrze, podczas gdy to:

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

    Nie skompiluje się, zamiast tego kompilator zgłosi błąd:

    Operator „Is” nie akceptuje operandów typu „Integer”.
    Operandy muszą być typami referencyjnymi lub dopuszczającymi wartość null.

  2. IsNothing(object)jest w rzeczywistości częścią części Microsoft.VisualBasic.dll.
    Jest to niepożądane, ponieważ masz niepotrzebną zależność od biblioteki VisualBasic.

  3. Jest wolna - w rzeczywistości o 33,76% wolniejsza (ponad 1000000000 iteracji)!

  4. Być może osobiste preferencje, ale IsNothing()brzmi jak stan Yody . Kiedy patrzysz na zmienną, sprawdzasz jej stan, jako przedmiot twojego badania.

    tj. czy to robi x? --- NIE Czy xing właściwość nim ?

    Więc myślę, że If a IsNot Nothingczyta lepiej niżIf Not IsNothing(a)

KyleMit
źródło
29

Zgadzam się z „Is Nothing”. Jak wspomniano powyżej, łatwo jest zaprzeczyć za pomocą „Nie ma nic”.

Uważam to za łatwiejsze do odczytania ...

If printDialog IsNot Nothing Then
    'blah
End If

od tego...

If Not obj Is Nothing Then
    'blah
End If
dumny
źródło
5

VB jest pełen takich rzeczy, próbując uczynić go zarówno "jak angielski", jak i wygodnym dla osób przyzwyczajonych do języków, które często używają () i {}. Na przykład po stronie „jak angielski”… VB ma słowo kluczowe „ Ain't ”… i nie, nie żartuję. Z drugiej strony, jak zapewne już wiesz, w większości przypadków możesz użyć () z wywołaniami funkcji, jeśli chcesz, ale nie musisz.

Wolę IsNothing () ... ale używam C i C #, więc to jest po prostu wygodne. Myślę, że jest bardziej czytelny. Ale idź z tym, co jest dla ciebie wygodniejsze.

Adam Haile
źródło
3
Twój link jest martwy, więc warto go tutaj znaleźć: web.archive.org/web/20050308014055/http://ea.3leaf.com/2004/08/ ... Warto jednak zauważyć, że wbrew powszechnemu przekonaniu jest to nie prawda.
Matt Wilko
5

Skłaniam się ku alternatywie „Is Nothing”, przede wszystkim dlatego, że wydaje mi się bardziej OO.

Z pewnością Visual Basic nie ma słowa kluczowego Ain't.

czas zgonu
źródło
Czy VB.NET może wykonywać metody rozszerzające? :)
klkitchens
2

Mam również tendencję do używania wersji Is Nothing, częściowo dzięki używaniu jej w takim samym stopniu, jak w SQL.

Brian Childress
źródło
1

Początkowo używałem IsNothing, ale starałem się używać Is Nothing w nowszych projektach, głównie ze względu na czytelność. Jedyny raz, kiedy trzymam się IsNothing, to utrzymywanie kodu tam, gdzie jest on używany i chcę zachować spójność.

Chris Tybur
źródło
-2

Is Nothing wymaga obiektu, któremu przypisano wartość Nothing. IsNothing () może przyjmować dowolną zmienną, która nie została zainicjowana, w tym typ liczbowy. Jest to przydatne na przykład podczas testowania, czy przekazano opcjonalny parametr.

ybacou
źródło
To jest źle. Czy na pewno nie zrozumiałeś tego w niewłaściwy sposób? IsNothing jest przeznaczone do pracy z typami referencyjnymi. Typ wartości nie może przechowywać wartości Nothing i powraca do wartości domyślnej, jeśli przypiszesz Nothing [...] IsNothing zawsze zwraca Fałsz ”. Ale „Reprezentuje wartość domyślną dowolnego typu danych. [...] W przypadku typów wartości [to] zależy od tego, czy typ wartości dopuszcza wartość null”. Więc czy nie jest lepiej? Nothing Is Nothing
underscore_d