2014-02-27 4 views
7

При изучении сборки в отражателе я наткнулся на ключевое слово fault в классе, сгенерированном компилятором.ключевое слово `Fault` в блоке try

Знаете ли вы кто-нибудь из тех значений, если это ключевое слово?

C#

private bool MoveNext() 
{ 
    bool flag; 
    try 
    { 
     // [...] 
    } 
    fault 
    { 
     this.Dispose(); 
    } 
    return flag; 
} 

vb.net

Private Function MoveNext() As Boolean 
    Dim flag As Boolean 
    Try 
     ' [...] 
    Fault 
     Me.Dispose 
    End Try 
    Return flag 
End Function 

ответ

10

Кто-нибудь из вас знает смысл, если это ключевое слово?

Да. Это недействительно C#, но в IL это эквивалент finally, но только если выбрано исключение.

В C# нет прямой корреляции, поэтому декомпилятор не может декомпилировать его на правильный C#. Вы можете подражать это что-то вроде:

bool success = false; 
try 
{ 
    ... stuff ... 
    success = true; // This has to occur on all "normal" ways of exiting the 
        // block, including return statements. 
} 
finally 
{ 
    if (!success) 
    { 
     Dispose(); 
    } 
} 

Я упоминаю его в моей iterator block implementation details статье, которая выглядит отношение к конкретному примеру :)

+0

Спасибо Джон! Я посмотрю вашу статью. –

0

Я думаю try { ...; } fault { ...; } должны быть переведены на C# try { ...; } catch { ...; throw; }

Смежные вопросы