Язык C # и .NET: замена использования макроса C - PullRequest
0 голосов
/ 21 января 2011

Я новичок в разработке .Net и ищу несколько советов.

У меня есть фрагмент кода, который выдает некоторые исключения. Эти исключения выбрасываются, если моя база данных недоступна, например. Я хочу предоставить пользователям возможность повторить выполненный код в случае неудачи.

Вот мой начальный код:

executeRequest();

Что я думаю в стиле C (но все равно работаю в C #):

do
{
    try
    {
        executeRequest();
        return;
    }
    catch (Exception exception)
    {
        ErrorMessagesUtils.ShowTaskErrorMessage(exception);
    }
} while (MessageBox.Show("Failed : Retry ?", "Error",
                         MessageBoxButtons.YesNo,
                         MessageBoxIcon.Question) == DialogResult.Yes);

Это работает, но очень неприятно воспроизводить его другими методами. Я хочу использовать с executeRequest , но не только .

Если бы я писал на C, я буду использовать #define ASK_USER_TO_RETRY(funcname) ...code.... Но в C # я не нашел способа повторно использовать кусок кода таким образом. Некоторые мысли?

Ответы [ 3 ]

4 голосов
/ 21 января 2011

Вы можете создать метод, который принимает делегат (метод, который будет выполнен):

public void Execute(Action action)
{
    do
    {
        try
        {
            action();
            return;
        }
        catch (Exception exception)
        {
            ErrorMessagesUtils.ShowTaskErrorMessage(exception);
        }
    } while (MessageBox.Show("Failed : Retry ?", "Error",
                 MessageBoxButtons.YesNo,
                 MessageBoxIcon.Question) == DialogResult.Yes);
}

Использование:

Execute(executeRequest);
1 голос
/ 21 января 2011

Это всегда довольно грустное зрелище - наблюдать, как пользователь стучит по кнопке повторной попытки, никуда не денясь.Они тоже продолжают это время, надеясь на чудо.Через полминуты они переключат мышь на левую руку.

Общая проблема в том, что они обвинят вас в проблеме.Даже если вы не имеете к этому никакого отношения и не можете ничего сделать для решения проблемы.В конце концов, именно вы пообещали, что повторная попытка будет иметь смысл.Они быстро потеряют доверие к вам, как к программисту, и к тому, что ваш продукт пригоден для использования и стоит своих денег.Не делайте этого, если у вас на самом деле нет способа в вашем коде выполнить другую стратегию.Это довольно редко.

0 голосов
/ 21 января 2011

Даже в C использование макроса для этого может быть плохой идеей.Как вы знаете, с препроцессором вы даже не видите то, что видит компилятор.Я бы предположил, что указатель на функцию будет лучше соответствовать этому сценарию.

Так что, как уже упоминалось, в C # указатели на функции заменяются делегатами.Вы можете думать о них как о типобезопасных указателях функций , если хотите.

Я бы порекомендовал Pro C # 2010 и .NET 4 Platform и C #Спецификация языка

...