1

うまくいくように思えますが、完全にはわかりません。そのため、これを実現できるかどうか、またどのように実現できるかについてアドバイスを求めています。

私のWebフォームには、「error」という名前のブール値があります。

ページを正常にロードするには、ページで発生する必要のあることがいくつかあります。

私はこのようなコードを書くことができます:

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

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

if(error)
  FailoverActions();

等々。

もちろん、それは非常に非効率的であるため、コードが次のようになるような種類のデリゲートを作成することは可能かもしれないと思いました。

エラー=DoThis();

...そしてここでエラー=trueのときに関数を呼び出すある種のトリガー。

正確な詳細が不足していることをお詫びしますが、これは私にとって新しい根拠です。


アップデート

素晴らしいアイデアをありがとうございました。

詳細がほとんどない理由は、私が非常に経験が浅く、.netでこれまでに見つけたのは、卵を割る方法はたくさんありますが、一般的に他の方法よりも優れている方法があるからです。

経験豊富なご意見に感謝いたします。

再度、感謝します。

4

7 に答える 7

2

なぜだめですか。デリゲートに割り当てられたブール値を返すメソッド。

こちらです

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();
于 2012-09-11T10:08:03.083 に答える
1

まず、メソッドを返すtruefalse、疑わしい方法です。特にエラーが比較的まれな場合は、例外を使用してこれを処理する必要があるようです。

サンプルコード:

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

迅速な解決策として、1つのオプションは短絡です。

bool success = DoThis() && DoThat() && DoTheOther();
if(!success) FailoverActions();
于 2012-09-11T10:18:30.390 に答える
1

Func<bool>初期化ステップを表すために使用できます。

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

ここで、Step1などはを返すメソッドboolです。

次に、このループはそれらを呼び出します。

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

        break; // use break to exit if necessary
    }
}
于 2012-09-11T10:11:37.490 に答える
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()
    {

    }
}
于 2012-09-11T10:15:25.093 に答える
0

デリゲートは、戻り値に関して不特定の動作をします。たとえば、複数のハンドラーがデリゲートに割り当てられている場合、使用される戻り値の1つが、どれを制御することはできません。これにより、正常な関数がエラーを覆い隠す場合が発生する可能性があります。割り当てられていない代理人を呼び出す危険性は言うまでもありません。

より良いオプションがありますが、達成したいことを明確にする必要があります。

于 2012-09-11T10:12:09.427 に答える
0

あなたが説明していることは、ステートマシンの設計パターンに適合します。
この種のものは、最新バージョンのステートマシンワークフローを実際に含むWindowsワークフローを使用してモデル化できます。

于 2012-09-11T10:20:32.123 に答える
0

これを試して:

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

if (error)
  FailoverActions();
于 2012-09-11T10:44:23.723 に答える