2012-09-11 90 views
1

我有一個想法,聽起來像它可能工作,但我不完全確定,所以尋找建議,以確定這是否可以實現和如何。c#是否可以創建一個這樣的委託?

在我的web表單上,我有一個名爲'error'的布爾值。

有一些事情需要在頁面上發生才能成功加載。

我可以寫這樣的代碼:

bool thisSuccess = DoThis(); 
if(!thisSuccess) 
    then error; 

bool thatSuccess = DoThat(); 
if(!thatSuccess) 
    then error; 

if(error) 
    FailoverActions(); 

等。

當然,這將是wholley效率不高,所以我想它可能是更多鈔票來創造某種形式的代表,其中的代碼會是這個樣子:

錯誤= DoThis();

...和某些類型的觸發器,當error = true時調用函數;

道歉的缺乏準確的細節,但這對我來說是新的領域。


更新

感謝大家對他們的偉大思想。

是有小細節的原因是,我非常缺乏經驗,我所發現的最新.NET的是,雖然有很多方法破解一個雞蛋,還有一般比其他一些更好。

我很欣賞你有經驗的觀點。

再次感謝。

+1

你會得到5個答案告訴你使用異常。作爲先發制人的罷工,你能解釋爲什麼你不在這裏使用例外嗎? – Kobi

+0

「當然,這將是低效的」 - 爲什麼? –

+0

@kobi - 雖然發生錯誤,但我可能想要處理異常,例如重定向到特定的替代頁面。 – dotnetnoob

回答

1

首先 - 有你的方法返回truefalse是一個值得商榷的做法 - 它看起來像你應該使用異常來處理這一點,特別是如果錯誤是比較少見的。

示例代碼:

try 
{ 
    DoThis(); 
    DoThat(); 
} 
catch(DoingThingsException ex) 
{ 
    FailoverActions(); 
    //throw; //? 
} 

對於一個快速解決方案,一種選擇是短路:

bool success = DoThis() && DoThat() && DoTheOther(); 
if(!success) FailoverActions(); 
+0

我決定正確的做法是在這種情況下拋出一個例外,所以當Kobi第一次以原始評論推薦時,給出了答案。 – dotnetnoob

2

爲什麼不。返回分配給delegete的bool值的方法。

這樣

public delegate bool PerformCalculation(); 

PerformCalculation = DoThis(); 
if (!PerformCalculation()) 
    then error; 

PerformCalculation = DoThat(); 
if(!PerformCalculation()) 
    then error; 

if(error) 
    FailoverActions(); 

替代的解決方案

無需委託。只要有2種方法

bool DoThis()bool DoThat()

if (!DoThis()) 
    then error; 

if(!DoThat()) 
    then error; 

if(error) 
    FailoverActions(); 
+2

這是一個答案?我同意這個問題不是很清楚,但你至少可以提供一些例子。 –

+0

在這種情況下委託是不必要的。 爲什麼不只是做 如果(DoThis()) .. 否則,如果(找時間做()) .. 其他 .. –

1

你可以使用Func<bool>表示初始化步驟:

var steps = new List<Func<bool>>() 
{ 
    Step1, 
    Step2, 
    Step3 
}; 

其中第一步,等的方法返回bool

那麼這個循環中調用它們:

foreach (var step in steps) 
{ 
    if (!step()) 
    { 
     // an error occurred 

     break; // use break to exit if necessary 
    } 
} 
+0

取而代之的是循環的,你也可以做'BOOL成功= steps.All(步=> step());'。不確定這是一個有用的評論。 – Kobi

+0

是或者'.Any(step =>!step())'在第一次失敗時退出。 –

0

代表有關於返回值未指定的行爲。例如,如果多個處理程序分配給代表使用的返回值之一,但您無法控制哪一個返回值。這可能會導致成功功能掩蓋某些錯誤的情況。更不用說調用未分配代表的危險。

有更好的選擇,但你應該澄清你想達到什麼。

+1

如果每個人都認真對待這個問題,Linq就不會有這樣的事情:這取決於代表們返回的價值。 –

1

如何像:

public class MyClass 
{ 
    private bool _error; 

    private Func<bool> DoThis; 
    private Func<bool> DoThat; 

    public MyClass() 
    { 
     DoThis =() => true; 
     DoThat =() => false; 

     Validate(); 
    } 

    public void Validate() 
    { 
     Error = DoThis() && DoThat(); 
    } 

    public bool Error 
    { 
     get { return _error; } 
     set { 
      _error = value; 
      if (_error) FailoverActions(); 
     } 
    } 

    public void FailoverActions() 
    { 

    } 
} 
0

你所描述配不配狀態機designe模式。
這種事情可以使用Windows工作流模擬,它實際上包含最新版本的狀態機工作流。

0

試試這個:

if (!(DoThis() && DoThat())) 
    then error; 

if (error) 
    FailoverActions(); 
相關問題