从问题的评论中:
为什么没有更好的解决方案……?
隐式流控通常被认为是一种反模式——甚至有人反对异常的存在。一些特意不包含任何形式隐式流控的语言也存在(例如Go)。
以下是几种可用的方法。
显式流控
public bool ExitMethod() =>
public void SomeMethod()
{
if (ExitMethod()) return;
Console.WriteLine("Test");
}
没有文档注释,布尔返回值可能会令人困惑。使用枚举将导致自我记录的代码:
public enum ExitParentStatus : byte
{
Continue, Return
}
public ExitParentStatus ExitMethod() =>
public void SomeMethod()
{
if (ExitMethod() == ExitParentStatus.Return) return;
Console.WriteLine("Test");
}
使用状态进行显式流程控制
public enum RequestStatus : byte
{
Processing, Handled
}
public class Request
{
public RequestStatus Status { get; set; }
}
public void ExitMethod(Request request) =>
public void SomeMethod(Request request)
{
ExitMethod();
if (request.Status == Handled) return;
Console.WriteLine("Test");
}
使用yield return
这提供了其他开发人员正在接近设计不良代码的线索,稍微减少了出现错误的几率。
public void ExecuteConditionalCoroutine(IEnumerable<bool> coroutine)
{
foreach (var result in coroutine)
{
if (result) return;
}
}
public bool ExitMethod() =>
public IEnumerable<bool> SomeMethod()
{
yield return ExitMethod();
Console.WriteLine("Test");
}
ExecuteConditionalCoroutine(SomeMethod());
异常
如果你想让你的代码无法调试,请使用此方法。
public bool ExitMethod() { throw new ExitParentMethodException(); }
public void SomeMethod()
{
try
{
ExitMethod();
Console.WriteLine("Test");
}
catch (ExitParentMethodException) { }
}
后编译
使用类似于post-sharp的工具来自动注入代码分支。这是一种非常适用于难以维护代码的解决方案。
[ExitsParentMethod]
public bool ExitMethod() =>
public void SomeMethod()
{
ExitMethod();
Console.WriteLine("Test");
}
ExitMethod()
中抛出异常怎么样?或者你可以让ExitMethod
返回一个bool
,然后像这样使用它:if (ExitMethod()) return;
。 - René VogtExitMethod
返回某些内容,并用if(..) return;
包装调用。 - James Thorpe