문제

이것은 vb.net 언어에 대한 질문입니다. 나는 매일 그것을 사용하고 있기 때문에 그 구성의 일부의 동기를 이해하려고 노력합니다.

나는 단지이 줄을 발견했다 :

If myObject Is Nothing then

이 것만 큼 정확합니다.

If Nothing Is myObject Then

동일한 결과. ildasm을 사용 하여이 선이 다음으로 번역된다는 것을 알 수 있습니다.

if myObject = null then

그리고

if null = myObject then

글쎄, 그러나 vb.net에서는 다음을 쓸 수 없습니다.

if myObject = Nothing Then

컴파일러는이를 받아들이지 않습니다.

음, 나에게 myobject가 아무것도 없다면 보다 훨씬 덜 분명합니다 myObject = 아무것도 없다면.

VB.NET 저자는 왜 그 반대라고 생각 했습니까? 힌트가 있습니까?

도움이 되었습니까?

해결책

문제는 vb.net이 두 가지 유형의 객체 비교를 차별화한다는 것입니다. 즉, 참조 및 가치 비교.

vb.net의 "IS"연산자는 참조 비교에 사용됩니다. 문제의 값이 참조 유형 또는 널블 라블 일 때 사용할 수 있습니다. 값 유형을 비교하려고 시도하면이 방식으로 컴파일 오류가 발생합니다.

"="연산자는 값 비교에 사용됩니다. 값 비교는 클래스 정의에서 명시 적 =, <> 연산자 쌍을 정의하는 유형에만 사용할 수 있습니다. 평등의 실제 구현은 운영자의 구현에 따라 다릅니다.

C#은 값과 참조 비교 모두에 ==를 사용한다는 점에서 다른 접근법을 취합니다. 사용되는 것은 비교되는 값의 유형과 특정 평등 방법의 구현을 포함한 몇 가지 요인에 따라 다릅니다.

다른 팁

VB6과 Com에서 상속 된 것들 중 하나입니다. VB6은 참조 유형 객체 (인스턴스블)와 int와 같은 기본 유형을 구분합니다. 기준 유형은 "세트"연산자와 함께 작성하고 할당해야했지만 기본 유형은 단순히 "="를 사용했습니다.

글쎄, 어떤 경우에는 당신이 쓸 수 있습니다 If myObject = Nothing Then, 그러나 그것은 널 비교가 아닙니다.

Dim someValue As Integer
If someValue = Nothing Then
    ' do something '
End If

위의 코드는 다음과 같습니다.

Dim someValue As Integer
If someValue = 0 Then
    ' do something '
End If

이 경우 "emtpy"값이있는 값 유형이 있습니다 (0의 경우 0 Integer, Point.Empty a Point 예로서 구조). IS 운영자는 a 참조 비교 (비교 객체가 동일한 인스턴스인지 확인), 동일 부호는 가치 비교.

또 다른 생각은 VB가 루프 및 조건부 구문 중 일부를 보면 더 장황한 것입니다. 몇 가지 예 :

VB :

If x==0 Then
End If

While 
End While

For i = 0 to 10 Step 2
Next i

씨#

 If x==0 
 {
 }

 While 
 {
 }

 for (int i = 0; i<=10;i+2)
 {
 }

vb.net 코드에서 모든 추가 단어를 보시겠습니까? 그것이 차이의 또 다른 가능한 이유입니다.

사용 Is Nothing 클래식 비주얼 기본 (IE 6.0 이하)의 시대로 거슬러 올라가는 구조입니다.

호환성의 일부를 유지하기 위해 If 명령문) 이것은 vb.net으로 전달되었습니다.

다행히도 Ocdecio 지적하면, 다른 유사한 peccadillos가 있었는데 Set 변수에 객체를 할당하기위한 명령문.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top