Ключевое слово `Fault` в блоке try

Изучая сборку в рефлекторе, я наткнулся на ключевое слово fault в классе, сгенерированном компилятором.

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

С#

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

person Bjørn-Roger Kringsjå    schedule 27.02.2014    source источник


Ответы (1)


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

да. Это недопустимый 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();
    }
}

Я упоминаю об этом в своей статье детали реализации блока итератора, которая выглядит актуальной для вашего конкретного примера :)

person Jon Skeet    schedule 27.02.2014
comment
Итак... вышло ли что-нибудь из идеи yield do в этой статье? Кроме того... fault звучит так, как будто это было бы хорошим дополнением к C# :) - person Corey; 09.02.2021
comment
@Corey: Нет, боюсь, что нет. - person Jon Skeet; 09.02.2021