2011-01-21 6 views
0

.Net 개발의 새로운 기능이며 일부 조언이 필요합니다.C# 및 .NET 언어 : C 매크로 대체 사용

몇 가지 예외를 발생시키는 코드가 있습니다. 이러한 예외는 데이터베이스가 다운 된 경우 발생합니다. 나는 사용자가 실패한 경우 실행 된 코드를 다시 시도 할 수있는 기능을 원합니다. 여기

내 초기 코드 :

나는 C-스타일 thinked (그러나 C#으로 어쨌든 일) 한 무엇
executeRequest(); 

: 제대로 작동

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

젠장, 당신은 약 30 초 정도 나를 때려 :) –

+0

매개 변수가있는 몇 가지 방법을 실행해야한다면, 당신은 이것을한다 : Execute (delegate {SomethingWithParam (param1, param2);}); –

1

그것은 멀리 두드리는 사용자를 볼 수있는 아주 슬픈 광경이 항상 아무데도 가지 않고 재 시도 버튼. 그들은 기적을 바라면서 잠시 동안 그것을 유지합니다. 그들은 30 분 후에 마우스를 왼손으로 바꿀 것입니다.

일반적인 문제는 입니다. 비록 당신이 그것과 관련이 없으며 문제를 해결하기 위해 아무것도 할 수는 없습니다. 결국, 은 재 시도가 이치에 맞을 것이라고 약속했습니다. 프로그래머와 제품이 사용 가능하고 돈을 가치있게 사용하는 것처럼 빨리 자신감을 잃을 것입니다. 실제로에 다른 전략을 실행하는 코드가없는 한이 작업을 수행하지 마십시오. 아주 드문 일입니다.

+0

디자인 관점에서 말하자면, 사용자가 사망 할 때까지 다시 시도 할 수있는 좋은 방법은 아닙니다. 나는 요점을 가졌다 :) – Doomsday

0

C의 경우에도 매크로를 사용하는 것이 좋지 않을 수 있습니다. 아시다시피, 전처리 기는 컴파일러가 보는 것을 보지 못합니다. 나는 함수 포인터가 그 시나리오에 더 잘 어울릴 것이라고 생각한다.

다른 사람들이 언급했듯이 C# 함수 포인터는 대리자로 바뀝니다. 원한다면 형식 안전 함수 포인터으로 생각할 수 있습니다.

나는 같은 방법으로 그것을 할 것 Pro C# 2010 and the .NET 4 PlatformC# Language Specification