2014-11-13 1 views
-5

내가 객체 배열을 객체 배열 NULL 체크에 실패 같음왜 (NULL)이 다음과 같이

어느 시점에서 [0]은 null이지만 [1]은 null이 아닙니다.

나는 값이 Equals으로 null의 경우 확인이 발생 예외 :

if (!_yazdirmaBilgisi[0].Equals(null)) //Throws exception 

하지만 != 널 NE 예외

if (_yazdirmaBilgisi[0] != null) // No exception 

확인하면 왜 다른가? 이유가 Equals(null)이 예외를 throw하지만 != null이 아닌 경우

+6

'_yazdirmaBilgisi [0] .Equals'는 인스턴스 메소드'Equals'를 호출하는 것을 의미하고'_yazdirmaBilgisi [0]'는 null이므로 NRE – Habib

+2

@Habib을 얻습니다. 짧은 경우에도 대답 ^^ –

+1

그리고 무슨 예외가 던지나요? 그래서 당신은 당신 자신의 질문에 대답 할 수 있습니다. – Jodrell

답변

1

이 줄 :

if (!_yazdirmaBilgisi[0].Equals(null)) 
  1. 추출물 참조

    var element = _yazdirmaBilgisi[0]; 
    if (element.Equals(null)) // element is null, and null.Equals is calling a method on a null reference 
    

    == 연산자는 이와 비슷한 뭔가를 정의 :이 코드가 무엇을하고 있는지입니다 _yazdirmaBilgisi[0]

  2. 를 호출 할 개체로 해당 참조를 사용합니다..

그러나 참조가 null이기 때문에 NullReferenceException을 던집니다. 이 참조 된 개체의 메소드를 호출하려고하지 않습니다 -

if (_yazdirmaBilgisi[0] != null) 

직접 널 (null)로 _yazdirmaBilgisi[0]에서 참조를 비교, 그래서 예외를 throw하지 않습니다 : 반면

.

1

첫 번째 요소는 목록의 첫 번째 요소가 null 참조이므로 throw됩니다.

var element = _yazdirmaBilgisi[0]; // element is reference who's value is null 
if (object.ReferenceEquals(element, null)) // object.Equals is a static method which doesn't require an object instance 
+4

* == 연산자가이 작업을 오버로드합니다. * 오해의 소지가 있습니다. –

+0

@SriramSakthivel 나는 과부하라는 용어를 삭제했다. 그렇지 않으면 오해의 소지가있다. – Andy

+0

이제 괜찮습니다. * overloaded *라는 용어가 오도 된 것뿐만 아니라 'object.Equals'를 수행하기 위해 과부하가 걸렸다 고 잘못 말했습니다. 나중에 'ReferenceEquals'로 변경했습니다. –

3

== null.Equals(null)과 같지 않습니다. Equals을 사용하는 경우 null 참조에 액세스하려고 시도하기 때문에 분명히 예외가 발생합니다. ==은 두 값이 모두 NULL인지 먼저 확인한 다음 비교를 수행한다는 점에서 Object.Equals(a,b)과 유사하게 작동합니다.