2016-08-12 3 views
0

는 좀하지 그 이전 코드를 통과하면서이 라인을 통해 캠과 누구도 그것을 할 것 인 이유를 이해하지 않습니다'?' LINQ 문 중간에

return dbStudents.MethodToReturnAllStudents()?.Select(x => new dtoStudent(x)); 

MethodToReturnAllStudentsIEnumerable<SQLDomain.Student> (dtoStudent)을 반환하는 다른에 네임 스페이스 - SQLDomain.Student은 모두 IDataRecord에서 매핑되었습니다.

왜이 문장의 중간에 ?이 올까요? MethodToReturnAllStudentsnull을 반환하면 LINQ Select은 아무 작업을 시도합니까?

주변의 끔찍한 코드입니까?

사이드 노트 : 어쨌든, 나는 그것을 대체 표준을 따르고 훨씬 더 읽기 쉽도록 리팩토링하고있다.

+5

아주 오래된 코드는 아닙니다.이것은 null을 확인하는 C# 6.0 구문입니다. [Null-Conditional Operator] (https://msdn.microsoft.com/en-us/library/dn986595.aspx?f=255&MSPPError=-2147217396) – Steve

+1

나는 개인적으로 이와 같은 코드를 좋아합니다. 프로그래머가 언어를 잘 알고 있음을 보여줍니다. – user1274820

+0

@steve 정식 적으로 언급 - 꽤 오래 VB.net에 살았습니다. –

답변

2

이 "기존 코드"가되지 않습니다이기 때문에, C# 6 기능인 Null Conditional Operator. 이 매개 변수를 사용하면 해당 인스턴스에서 속성/메서드 사용을 허용하기 전에 바로 앞의 값이 null인지 확인합니다. null의 경우, null를 돌려줍니다.

var students = dbStudents.MethodToReturnAllStudents(); 
if (students == null) return null; 
return students.Select(x => new dtoStudent(x)); 

그러나, 실제로 익숙하지 않은 운전자에 비해이 코드에 더 큰 잠재적 인 문제가 있습니다 :이 시나리오에서는

, 당신은이 코드를 변환 할 수 있습니다.

일반적인 합의는 IEnumerable<T>이 결코 null을 반환해서는 안되며, 따라서 null 확인이 필요하지 않습니다. 항상 수화되었거나 비어있는 시퀀스를 반환해야합니다.

사실, 이것이 실제로는 List<T> (또는 덜 일반적이지만 null IEnumerable)이라면 이것은 현실적인 시나리오가 될 수 있습니다 (하지만 null은 반환하지 않고 텅 빈 목록을 반환하지 않을 것을 주장합니다).

Null Conditional Operator이 더 간결하고 읽기 쉬운 경우 개발 팀으로 결정해야합니다. 개인적으로, 나는 그것의 팬이다. 단지 더 큰 디자인 냄새를 나타 내기 때문에이 컨텍스트에서 그렇지 않다.

1

"끔찍한"코드는 아니지만 구문에 익숙하지 않은 경우 직관적이지 않습니다. 나는 개인적으로 덜 자세한 옵션을 즐긴다. MethodToReturnAllStudents()가 null을 반환하고 null 만 반환하면 LINQ가 중지됩니다. 기본적으로 말하는 것입니다.

var retVal = dbstudents.MethodToReturnAllStudents(); 
if(retVal == null) { 
    return retVal; 
} else { 
    return retVal.Select(x => new dtoStudent(x)); 
} 

이제 사용자가 지적했듯이 호출자가 IEnumerable을 예상하므로 null을 반환하지 않아야합니다. 널 병합 연산자를 사용

var retVal = dbstudents.MethodToReturnAllStudents(); 
if(retVal == null) { 
    return new List<student>(); 
} else { 
    return retVal.Select(x => new dtoStudent(x)); 
} 

코드가 더욱 간결하게하고 여전히 제대로가 null 반환하지 않도록 형태를 돌려 처리합니다

return dbStudents.MethodToReturnAllStudents()?.Select(x => new dtoStudent(x)) ?? new List<student>(); 
1

그것은 dbStudents.MethodToReturnAllStudents()가 null이면 대신 ALL 기타 사항 서보 -OFF을 실행 널 리턴 할 널 조건 연산자 MSDN Documentation

하다 (X => 새로운 dtoStudent (X)) NullReferenceException이 될 것이다 .

+0

'NullPointerException'은 Java에서 왔으며 C#에서는 NullReferenceException입니다. –

+0

ACK, 햄릿 잡기에 감사드립니다. 나는 항상 그렇게한다. 나는 자바 루트에서 왔고 주로 C#을 사용했다. 이상적으로 나는 그 예외를 보지 못했지만주의를 기울이지 않을 때 여전히 자바 이름을 사용합니다. – TychonOmega