1

我有一个听起来可能可行的想法,但我不完全确定,因此寻求有关是否可以实现以及如何实现的建议。

在我的网络表单上,我有一个名为“错误”的布尔值。

要成功加载页面,需要在页面上发生许多事情。

我可以这样写代码:

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

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

if(error)
  FailoverActions();

等等。

当然,这完全是低效的,所以我认为可以创建某种类型的委托,代码看起来像这样:

错误 = DoThis();

...还有某种触发器,当error = 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

首先 - 让你的方法返回true或者false是一个有问题的做法 - 看起来你应该使用异常来处理这个问题,尤其是在错误相对罕见的情况下。

示例代码:

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

至于快速解决方案,一种选择是短路:

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

您所描述的内容适合状态机设计模式。
这种东西可以用Windows Workflow建模,最新版本中其实包含了状态机工作流。

于 2012-09-11T10:20:32.123 回答
0

尝试这个:

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

if (error)
  FailoverActions();
于 2012-09-11T10:44:23.723 回答
0

代表对返回值有未指定的行为。例如,如果将多个处理程序分配给委托使用的返回值之一,但您无法控制哪一个。这可能会导致成功的功能掩盖某些错误的情况。更不用说调用未分配的代表的危险了。

有更好的选择,但你应该澄清你想要实现的目标。

于 2012-09-11T10:12:09.427 回答