use*_*702 3 .net c# if-statement return
我想知道是否有办法不必重复相同的if构造,而是调用StatusCheck().成功时它不能返回true.谁知道这个问题有更好的头衔?
bool Enable()
{
if (!GetStatus(ref status)) { Trace.WriteLine("Error"); return false; }
// do stuff
if (!GetStatus(ref status)) { Trace.WriteLine("Error"); return false; }
// do more stuff
if (!GetStatus(ref status)) { Trace.WriteLine("Error"); return false; }
// do even more stuff
// 6 more times the above
return true;
}
Run Code Online (Sandbox Code Playgroud)
我会将由"Do stuff"表示的代码重构为方法.您调用这些方法并捕获异常或检查这些方法的返回值(可能是当前状态),而不是重复调用GetStatus().
另外,我不明白为什么一个被调用的方法GetStatus()会有一个ref参数似乎是由具有当前状态的方法更新的?如果你必须拥有GetStatus()我GetStatus()没有参数的方法,并实际返回当前状态.
即
Status status = GetStatus();
Run Code Online (Sandbox Code Playgroud)
如果您选择允许这些方法抛出异常,那么请注意,在抛出异常时不要开始应用实际逻辑 - 异常不是控制程序流的正确方法.
CheckStatus()如果状态无效,您可以创建抛出异常的方法,然后在Enable()方法中处理该异常:
public void CheckStatus(int status)
{
if (!IsValidStatus(status)) {
throw new InvalidStatusException(status);
}
}
public bool Enable()
{
try {
CheckStatus(status);
// do stuff
CheckStatus(status);
// do more stuff
CheckStatus(status);
// do even more stuff
// 6 more times the above
return true;
} catch (InvalidStatusException) {
Trace.WriteLine("Error");
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
根据你想要的严重程度,你可以构建某种行动队列,以便在方法中打破"做事".
protected delegate void DoStuffDelegate(ref {TYPE} statusToCheck);
bool Enable()
{
List<DoStuffDelegate> stuffToDo = new ...
stuffToDo.Add(myFirstMethod);
stuffToDo.Add(mySecondMethod);
foreach(var myDelegate in stuffToDo)
{
if(!GetStatus(ref status)) { Trace.WriteLine("Error"); return false; }
myDelegate(ref status);
}
}
Run Code Online (Sandbox Code Playgroud)
对于好的和坏的C#都不允许任何其他构造(如预处理器定义或我们在C++中得到的).
| 归档时间: |
|
| 查看次数: |
5661 次 |
| 最近记录: |