c#是否可以创建这样的委托?

时间:2012-09-11 10:06:35

标签: c# .net delegates

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

在我的网络表单上,我有一个名为'error'的bool值。

在页面上需要进行许多操作才能成功加载。

我可以写这样的代码:

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

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

if(error)
  FailoverActions();

等等。

当然,这将是无效的,所以我认为创建一个代码看起来像这样的代理可能是可行的:

error = DoThis();

...这里的某种触发器在error = true时调用了一个函数;

对于缺乏准确细节的道歉,但这对我来说是个新的基础。


更新

感谢大家的好主意。

没有细节的原因是我非常缺乏经验,而且我发现与.net相关的是,虽然有许多方法可以破蛋,但通常有一些比其他方法更好。

感谢您经验丰富的观点。

再次感谢。

7 个答案:

答案 0 :(得分: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();

答案 1 :(得分: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
    }
}

答案 2 :(得分: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()
    {

    }
}

答案 3 :(得分:1)

首先 - 让您的方法返回truefalse是一个值得怀疑的做法 - 看起来您应该使用异常来处理此问题,尤其是在错误相对较少的情况下。

示例代码:

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

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

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

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

您所描述的内容适合状态机设计模式 这种事情可以使用Windows Workflow建模,实际上包括最新版本的状态机工作流程。

答案 6 :(得分:0)

试试这个:

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

if (error)
  FailoverActions();