我有一个想法,听起来它可能有效,但我不完全确定,所以寻求关于这是否可以实现以及如何实现的建议。
在我的网络表单上,我有一个名为'error'的bool值。
在页面上需要进行许多操作才能成功加载。
我可以写这样的代码:
bool thisSuccess = DoThis();
if(!thisSuccess)
then error;
bool thatSuccess = DoThat();
if(!thatSuccess)
then error;
if(error)
FailoverActions();
等等。
当然,这将是无效的,所以我认为创建一个代码看起来像这样的代理可能是可行的:
error = DoThis();
...这里的某种触发器在error = true时调用了一个函数;
对于缺乏准确细节的道歉,但这对我来说是个新的基础。
更新
感谢大家的好主意。
没有细节的原因是我非常缺乏经验,而且我发现与.net相关的是,虽然有许多方法可以破蛋,但通常有一些比其他方法更好。
感谢您经验丰富的观点。
再次感谢。
答案 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)
首先 - 让您的方法返回true
或false
是一个值得怀疑的做法 - 看起来您应该使用异常来处理此问题,尤其是在错误相对较少的情况下。
示例代码:
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();