c# - 在 C# 中是否有另一种方法来链接相互关联的“if”块?
问题描述
比如说,有 5 个(或更多)任务(方法)返回true
或false
;如果任何连续的方法返回,我正在使用一种算法语法来打破链,false
否则继续向内。目前,我已经构建了一堆相互链接的 if 块;但是,对我来说似乎很丑陋,并且很难通过一堆论据来阅读。
if (Method_1_Returns(String manyArgs, ...) == true) {
if (Method_2_Returns(String manyArgs, ...) == true) {
if (Method_3_Returns(String manyArgs, ...) == true) {
if (Method_4_Returns(String manyArgs, ...) == true) {
...
}
else {
MethodToShowError(someString_4);
}
}
else {
MethodToShowError(someString_3);
}
}
else {
MethodToShowError(someString_2);
}
}
else {
MethodToShowError(someString_1);
}
我打算把它转换成一个switch
块,但除了讨厌goto
指令之外,这似乎不符合编码标准(或者,是吗?)。
String temp = "1";
switch (temp) {
case "1":
if (Method_1_Returns(String manyArgs, ...)) goto case "2";
MethodToShowError(someString_1);
break;
case "2":
if (Method_2_Returns(String manyArgs, ...)) goto case "3";
MethodToShowError(someString_2);
break;
case "3":
if (Method_3_Returns(String manyArgs, ...)) goto case "4";
MethodToShowError(someString_3);
break;
case "4":
if (Method_4_Returns(String manyArgs, ...)) goto case "5";
MethodToShowError(someString_4);
break;
...
default:
break;
}
C# 中是否存在更好的替代方案?switch
块替代可以接受吗?
解决方案
这里最简单的建议是快速失败:
if (!Method_1_Returns(String manyArgs, ...)) {
MethodToShowError(someString_1);
return;
}
if (!Method_2_Returns(String manyArgs, ...)) {
MethodToShowError(someString_2);
return;
}
if (!Method_3_Returns(String manyArgs, ...)) {
MethodToShowError(someString_3);
return;
}
if (!Method_4_Returns(String manyArgs, ...)) {
MethodToShowError(someString_4);
return;
}
除此之外,它实际上取决于被调用的方法链。如果它们都具有相同的签名并采用相同的参数,那么它们可以被放入一个数组并在循环中调用。
推荐阅读
- command-line - 定义退出 ipython 的快捷方式
- angular - Angular HttpClientInMemoryWebApiModule url 是如何定义的?
- c# - 将属性绑定到另一个对象中的属性
- chapel - Chapel 相当于 numpy `arange` / 相当于 C for 循环
- laravel - VueJs 的最佳实践使用 laravel mix 和放置 app.js 以及来自 sass 的 bootstrap 和 app.css
- python-3.x - Python 中的这个 Postgresql 查询有什么问题?
- c# - 如何使用动态生成的按钮删除 RichTextBox?
- css - 无法在 Firefox 中使用 Materialize 1.0.0 输入密码输入字段
- sql - 在会话日志表中查找最大并发用户
- objective-c - Apple Metal Element-wise 矩阵乘法(Hadamard Product)