2011-01-21 7 views
0

Я новичок в разработке .Net, и я ищу некоторые советы.C# и язык .NET: Замена использования C Macro

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

Вот мой исходный код:

executeRequest(); 

Что я thinked в 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# я не нашел способ повторно использовать кусок кода таким образом. Некоторые мысли?

ответ

4

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

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); 
+0

Я хотел бы сделать это таким же образом. Здесь вы можете узнать больше о делегатах (это как-то вроде указателя на метод в C): http://msdn.microsoft.com/en-us/library/ms173171(v=vs.80).aspx и после него вы можете читайте о лямбда-выражениях: http://msdn.microsoft.com/en-us/library/bb397687.aspx –

+1

Черт побери, вы избили меня до тридцати секунд :) –

+0

Кстати, если вам нужно выполнить какой-то метод с параметрами, вы делаете это: Выполнить (делегировать {SomethingWithParam (param1, param2);}); –

1

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

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

+0

Вы правы, с точки зрения дизайна, это не лучший способ позволить пользователю повторить попытку до самой смерти. У меня есть точка :) – Doomsday

0

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

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

Я бы порекомендовал Pro C# 2010 and the .NET 4 Platform и C# Language Specification