될 것입니다 이 C#
기능을 이해하려면 foreach
내부 코드를 이해해야합니다. foreach
문에서 표현의 오른쪽 부분이 IEnumerable(<T>)
인터페이스를 구현해야하며, 전체 루프는 내부적으로이 같은 간단한 while
, 뭔가 :
// here can be NullReferenceException
var en = text.GetEnumerator();
while(en.MoveNext())
{
var c = en.Current;
{
...
}
}
당신이 볼 수 있듯이,이 코드의 포인트가되는 NRE
수
if (text.IsNullOrWhitespace())
{
throw new ArgumentNullException(nameof(text));
}
// while loop here or text.SomeLinqCodeHere()
정말 필요하지 않습니다 여기에 몇 줄의 코드가 일부 엔트로피를 추가 :이 같은 열거 전에 전체 루프 또는 Enumerable
extensions class를 확인해야하므로, 발생 진정한 가치는 없다. foreach
간단한 정말 의견을 기반 코드 표준에 대한 결정하지만,이 기능의 진정한 목적의 경우에는 다음과 같이 ?.
operator 같은 C#7
다른 새로운 것을 함께 체인 경우 : 던지는 이러한 경우
int? length = customers?.Length ?? throw new ...;
Customer first = customers?[0] ?? throw new ...;
int? count = customers?[0]?.Orders?.Count() ?? throw new ...;
예외는 코드 줄의 끝 부분에 언급 유사합니다
int? length = customers?.Length; // should not be null
Customer first = customers?[0]; // should not be null
int? count = customers?[0]?.Orders?.Count(); // should not be null
을하지만 코드에 대한 몇 가지 엄격한 계약과 같은 규칙을 추가합니다.그런 식으로 foreach
루프의 성능에 관해서는
, 이미 말했듯이, 그것은 열거를 받고 한 번만 발생으로 고생하고
전에 실제 루프하지 않습니다.
테스트했을 때 성능에 어떤 영향을 줬습니까? 니가 그랬니? 자신의 질문에 대한 답을 스스로 이해하는 데 필요한 검사만으로는 충분하지 않은 이유를 설명하십시오. 정확하게 테스트 한 결과를 정확하게 보여주는 좋은 [mcve]가 포함되도록 질문을 수정하고 테스트에 대해 정확히 이해할 수없는 부분에 대한 자세한 설명을 포함하십시오. –
번. 'text'가 null 인 경우, 조건문은 일단 히트됩니다. 설명 없이는 논리적이어야합니다. 반복하는 경우 열거자를 반복 할 때까지 한 번만 표시됩니다. –
@PeterDuniho 질문의 틀이 어떻게 틀린 지 잘 모르겠습니다. – Svek