IsNothing 대 Is Nothing


130

여기에 VB.NET을 사용하는 사람이 있습니까 (예 : 또는 ) IsNothing와 반대되는 사용 을 선호하거나 반대 합니까? 그렇다면 왜 그렇습니까?Is NothingIf IsNothing(anObject)If anObject Is Nothing...

편집 : 둘 다 똑같이 수용 가능하다고 생각되면 하나를 선택하고 고수하는 것이 가장 좋다고 생각합니까, 아니면 혼합해도 괜찮습니까?


3
있습니다 많은 사용을 피하는 좋은 이유IsNothing()
KyleMit

@JesseChisholm, 단일 의견에 대한 의견이 너무 많지만 이전의 의견은이 기사에 5 개의 다른 기사를 열거하는 기사에 대한 링크를 게시했습니다. blog.reneorban.com/2011/12/vbnet-isnothing-vs-is-nothing.html
KyleMit

테크놀로지 답변은 정말 흥미롭지 만 부끄러운 점은 질문이 너무 개방되어 있고 아무 소용이없는 답변을 만들어
underscore_d

답변:


125

MSIL이 실행될 때 살펴보면 정확히 동일한 코드로 컴파일되지 않는다는 것을 알 수 있습니다. IsNothing ()을 사용하면 표현식을 평가하는 대신 실제로 해당 메소드를 호출합니다.

"Is Nothing"을 사용하는 경향이있는 이유는 내가 개인적으로 더 읽기 쉬운 것처럼 보이는 "Not IsNothing (object)"가 아니라 "IsNot Nothing"이되는 것을 부정 할 때입니다.


46

나는 것을 발견 패트릭 스틸은 자신의 블로그에이 질문에 최선을 대답 IsNothing 방지 ()

Patrick Steele이 자신의 게시물에 대한 신용을 얻도록 그의 답변을 여기에 복사하지 않았습니다. 그러나 Is Nothing 또는 IsNothing 중 어느 것을 사용할지 결정하려고한다면 그의 게시물을 읽어야한다고 생각합니다. Is Nothing이 최선의 선택이라는 데 동의 할 것입니다.

편집-VoteCoffe의 의견은 여기에

부분 기사 내용 : 더 많은 코드를 검토 한 후 이것을 피해야하는 또 다른 이유를 발견했습니다. 값 유형을 허용합니다! 분명히 IsNothing ()은 '객체'를 허용하는 함수이므로 원하는 것을 전달할 수 있습니다. 값 형식 인 경우 .NET은 개체에 상자를 만들어 IsNothing에 전달합니다.이 값은 항상 상자 값에 대해 false를 반환합니다! VB.NET 컴파일러는 "Is Nothing"스타일 구문을 검사하고 값 유형에 대해 "Is Nothing"을 시도하면 컴파일되지 않습니다. 그러나 IsNothing () 함수는 불만없이 컴파일됩니다. PSteele – VoteCoffee


7
부분 기사 내용 : 더 많은 코드를 검토 한 후 이것을 피해야하는 또 다른 이유를 발견했습니다. 값 유형을 허용합니다! 분명히 IsNothing ()은 '객체'를 허용하는 함수이므로 원하는 것을 전달할 수 있습니다. 값 형식 인 경우 .NET은 개체에 상자를 만들어 IsNothing에 전달합니다.이 값은 항상 상자 값에 대해 false를 반환합니다! VB.NET 컴파일러는 "Is Nothing"스타일 구문을 검사하고 값 유형에 대해 "Is Nothing"을 시도하면 컴파일되지 않습니다. 그러나 IsNothing () 함수는 불만없이 컴파일됩니다. PSteele
VoteCoffee 12

7
링크가 끊어 질지 모르는 일부 내용을 게시했으며 그것이 커버리지에 좋은 점을 추가했다고 생각했습니다.
VoteCoffee

33

절대로 사용하지 마십시오 IsNothing()

IsNothing () VS Is Nothing 기사의 4 가지 이유 는 다음과 같습니다.

  1. 가장 중요한 것은 IsNothing(object)모든 것이 객체, 심지어 값 유형으로 전달 된 것입니다! 값 유형은 일 수 없으므로 Nothing완전히 낭비되는 검사입니다.
    다음 예제를 보자.

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

    이것은 컴파일되고 잘 실행되지만 반면에 :

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

    컴파일하지 않고 대신 컴파일러에서 오류가 발생합니다.

    'Is'연산자는 'Integer'유형의 피연산자를 허용하지 않습니다.
    피연산자는 참조 또는 널 입력 가능 유형이어야합니다.

  2. IsNothing(object)실제로의 일부입니다 Microsoft.VisualBasic.dll.
    VisualBasic 라이브러리에 대한 불필요한 종속성이 있으므로 바람직하지 않습니다.

  3. 느리게-실제로 33.76 % 느리게 (1000000000 반복 이상)!

  4. 아마도 개인적인 취향이지만 요다 조건IsNothing() 처럼 읽습니다 . 변수를 볼 때 조사 대상으로 변수의 상태를 확인하고 있습니다.

    즉 수행 X합니까? --- NOT 인가 x의 속성 보내고 그것을 ?

    그래서 나는 If a IsNot Nothing더 잘 읽습니다If Not IsNothing(a)


29

"아무것도 없습니다"에 동의합니다. 위에서 언급했듯이 "IsNot Nothing"으로 부정하기 쉽습니다.

나는 이것을 더 쉽게 읽을 수 있다고 생각합니다 ...

If printDialog IsNot Nothing Then
    'blah
End If

이것보다...

If Not obj Is Nothing Then
    'blah
End If

5

VB는 (영어와 같은 언어를 사용하고 {}를 많이 사용하는 언어에 익숙한 사람들에게 "영어처럼"편안하게 만들려고하는 것과 같은 것들로 가득합니다. 예를 들어 "like english"사이드에서 ... VB에는 " Ai n't "키워드가 있습니다 ... 아니요, 농담이 아닙니다. 그리고 다른 한편으로, 이미 알고있는 것처럼 대부분 원한다면 함수 호출과 함께 ()을 사용할 수 있지만 꼭 할 필요는 없습니다.

나는 IsNothing ()을 선호하지만 ... C와 C #을 사용하므로 편안합니다. 그리고 더 읽기 쉽다고 생각합니다. 그러나 당신에게 더 편안한 느낌으로 가십시오.


3
귀하의 링크는 여기에 그 가치가 살아있는 한 무엇인지에 대한 죽은 그렇다 : web.archive.org/web/20050308014055/http://ea.3leaf.com/2004/08/... 워스 그러나 일반적인 생각과는 달리이 있음을 지적 사실이 아니다.
Matt Wilko 13:30에

5

나는 "아무것도없는"대안으로 기울어지고있다. 왜냐하면 그것은 더 많은 OO로 보인다.

확실히 비주얼 베이직은 되지 않는다 (가) 키워드 아닌가 얻었다.


VB.NET은 확장 방법을 사용할 수 있습니까? :)
klkitchens 2016 년


1

처음에는 IsNothing을 사용했지만 새로운 프로젝트에서는 주로 가독성을 위해 Is Nothing을 사용하는 방향으로 나아가고 있습니다. IsNothing을 고수하는 유일한 시간은 코드가 계속 사용되는 곳에서 코드를 유지하고 일관성을 유지하려는 경우입니다.


-2

Is Nothing에는 Nothing 값에 할당 된 개체가 필요합니다. IsNothing ()은 숫자 유형을 포함하여 초기화되지 않은 모든 변수를 사용할 수 있습니다. 예를 들어 선택적 매개 변수가 전달되었는지 테스트 할 때 유용합니다.


이것은 잘못이다. 당신은 잘못된 길을 얻지 못했다고 확신합니까? " IsNothing 은 참조 유형에서 작동하도록 고안되었습니다. 값 유형은 Nothing 값을 보유 할 수 없으며 Nothing [...] 을 할당하면 기본값으로 되돌 립니다 . IsNothing은 항상 False를 반환합니다 ." 그러나 "모든 데이터 유형의 기본값을 나타냅니다. [...] 값 유형의 경우 [this]는 값 유형이 널 입력 가능 여부에 따라 다릅니다." 그래서 아닌 더 나은? Nothing Is Nothing
underscore_d
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.