我有一个验证方法,我在循环中调用它。 如果验证失败,我想调用“继续”。 有没有办法从验证方法中调用“继续”? 我只是不想在循环中的这么多地方叫“继续”...
答案 0 :(得分:1)
不,流控制语句仅影响定义它们的块。唯一的内置方法是从堆栈中进一步改变控制流,这是一个例外,这对你正在做的事情来说肯定是错误的机制。
如果你被所有continue
所困扰,我建议你考虑采用更具说服力的思维方式。像这样定义验证循环的主体:
bool IsValid(Foo foo) {
if (Condition1(foo)) {
return false;
}
if (Condition2(foo)) {
return false;
}
// ... and so on
}
然后像这样验证:
if (!foos.All(IsValid)) {
// One of your foos is invalid
}
LINQ扩展方法All和Any会尽快中断执行,这意味着All会在找到第一个不满足条件的时候停止,Any会在找到第一个时停止。
答案 1 :(得分:1)
你的周期中有很多continue
,它会变得很烦人。您无法继续使用外部方法,因为它超出了范围。实际上有几种解决方案:
您可以从验证方法返回一个布尔值,然后按原样使用它:
if (!IsValid()) {
continue;
}
但是没有用,因为你仍然会有continue
s。
您可以将验证放在循环的开头,并且可以使用标志来确定迭代是否应该逐步执行,初始化为false:
while (myCondition) {
stepOut = false;
//validation region, you set stepOut to false if a validation fails
if (!stepOut) {
//operations
}
}
您可以将所有验证调用包装到方法中,让我们称之为myValidation
,然后:
while (myCondition) {
if (myValidation()) {
//operations
}
}
或
while (myCondition) {
if (!IsValid()) {
//continue
}
}
Exception
,但不要这样做。答案 2 :(得分:0)
只要在验证方法返回的地方返回false,然后检查验证方法是否返回false,在调用函数中断开循环。
答案 3 :(得分:0)
为什么不呢?
编程中的黄金法则:“总有办法”。
C ++允许您内联汇编语言语法。与此类似,C#也支持它。让我考虑你的例子。
void method1(){
foreach(var x in y)
{
Validate(x);
...
//Your other logic
...
EndOfLoop:
;
}
}
..
..
void Validate(T x)
{
#if IL
br EndOfLoop
#endif
}
//End Of Code
这将从您的代码中的任何位置“跳转”到“EndOfLoop”标签。根据您的代码,这可能是一种不好的做法..