2013-11-04 1 views
3

오늘 Reshaper를 내 PC에 설치하여 체크 아웃했습니다. 코드가 다음과 같을 때마다 Resharper에서 Null과 비교하면 정보가 필요하지 않습니다. 왜? 유형 I이 원하는 사람이고 값이 Null이 아닌 경우 만약 내가 확인하고If 문이 키워드이고 Null과 비교되는 경우

if (dataGrid.ItemsSource != null && dataGrid.ItemsSource is DataGridCollectionView) 

:

는 문입니다.

값이 여전히 Null이긴하지만 형식이 맞을 수 있으므로이 질문을하는 것이 좋습니다. 나는 이것에 관한 문서에서 뭔가를 놓쳐 버린 것 같아.

왜 Reshaper는 null과 비교할 필요가 없다고 말합니까?

무엇이 누락 되었습니까?

답변

8

is 연산자는 객체가 null 인 경우 항상 false을 반환하므로 유형을 테스트하기 전에 null을 확인하지 않아도됩니다. documentation에서

:

이 표현 제공된 표현 null 이외의이며, 제공된 객체가 예외를 발생시키지 않으면 서, 제공된 형식으로 캐스팅 할 수있는 경우 true로 평가합니다.

3

dataGrid.ItemsSource is DataGridCollectionView은 "dataGrid.ItemsSource가 DataGridCollectionView의 인스턴스 임"을 의미합니다. 그것이 인스턴스 (무엇이든)라면 null 일 수 없기 때문에 null 체크는 중복됩니다. null 검사가 is 시험이 이미하지 않습니다 아무것도 달성하지 않도록

+0

null이면 IS 키워드가 항상 false를 반환합니까? 이것이 어딘가에 기록되어 있습니까? –

+0

예, [is (C# Reference)] (http://msdn.microsoft.com/en-us/library/scekt9xw (v = versus90) .aspx) : * 제공된식이 참이면 true가됩니다. ** non-null **이고 .... * –

+0

예, 값이 null이면 null을 반환합니다. null은 모든 유형의 인스턴스가 아니기 때문에 항상 false를 반환합니다. http://msdn.microsoft.com/en-us/library/scekt9xw.aspx를 참조하십시오. * 제공된 표현식이 null이 아닌 경우 ** is 표현식이 true로 평가되고 제공된 객체는 예외가 throw되지 않고 제공되는 유형 * –

2

null 항상 is 테스트에서 false를 반환합니다. 미친 가장자리 경우 이것은 오작동 할 수 있습니다. 연속 호출시 다른 것을 반환하는 속성이있는 경우입니다. 따라서 첫 번째 .ItemsSource이 두 번째와 매우 다른 것을 반환하면 .ItemsSource입니다. 위험하고 자해가 될 것입니다.

+0

정말요? 이 문서는 MSDN의 어딘가에 있습니까? –

+0

@devhedgehog IIRC, 언어 사양; MS 버전의 7.9.10 섹션 –

+0

@devhedgehog 여기 ECMA 버전이 있습니다. http://www.jaggersoft.com/csharp_standard/14.9.9.htm : "e 값이 null이면 결과는 false입니다." –