문제

반복자 블록을 실험 한 후 생성 된 IL 코드가 내가 기대하는 것이 아님을 알았습니다. 트리 핀을 블록 대신 시도한 시도-결합 블록이 생성되는데, 본 적이없는 시도는 생성됩니다. 컴파일러가 '필기'C#에서 결함 키워드를 사용할 수 없다는 것을 알았습니다.

2 사이에 차이가 있습니까?

C# 코드 :

static IEnumerable<string> ReadAllLines(string fileName)
{
    using (var file = System.IO.File.OpenText(fileName))
    {
        string s;
        while ((s = file.ReadLine()) != null)
        {
            yield return s;
        }
    }
}

MSIL 코드 :

.method private hidebysig newslot virtual final instance bool MoveNext() cil managed
{
    .override [mscorlib]System.Collections.IEnumerator::MoveNext
    .maxstack 3
    .locals init (
        [0] bool CS$1$0000,
        [1] int32 CS$4$0001,
        [2] string CS$0$0002,
        [3] bool CS$4$0003)
    L_0000: ldarg.0 

    // try body

    L_008d: leave.s L_0097
    L_008f: ldarg.0 
    L_0090: call instance void ConsoleApplication2.Program/<ReadAllLines>d__0::System.IDisposable.Dispose()
    L_0095: nop 
    L_0096: endfinally 
    L_0097: nop 
    L_0098: ldloc.0 
    L_0099: ret 
    .try L_0000 to L_008f fault handler L_008f to L_0097
}

흥미로운 줄은 결함 핸들러가 지정된 IL의 마지막 줄이며, 정상적인 시도 블록에서 최종 처리기가 지정됩니다.

도움이 되었습니까?

해결책

예, 마지막으로 블록은 항상 프레임 출구에서 실행됩니다. 오류 블록은 프레임을 지나가는 예외가없는 경우에만 실행됩니다. Movenext의 결함 블록은 readalllines iterator의 시도 블록에서 제외 된 예외의 경우 사용 시맨틱을 보존합니다. 반복자에서 정상 출구에서 사용 시맨틱을 보존하기 위해 다른 메커니즘을 사용해야합니다.

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