如何退出vb.net中的嵌套for或循环?
我尝试使用exit,但它只跳转或断开一个for循环.
我怎样才能做到以下几点:
for each item in itemList
for each item1 in itemList1
if item1.text = "bla bla bla" then
exit for
end if
end for
end for
Run Code Online (Sandbox Code Playgroud) 我刚刚在.NET基础库的反射器中找到了这段代码......
if (this._PasswordStrengthRegularExpression != null)
{
this._PasswordStrengthRegularExpression = this._PasswordStrengthRegularExpression.Trim();
if (this._PasswordStrengthRegularExpression.Length == 0)
{
goto Label_016C;
}
try
{
new Regex(this._PasswordStrengthRegularExpression);
goto Label_016C;
}
catch (ArgumentException exception)
{
throw new ProviderException(exception.Message, exception);
}
}
this._PasswordStrengthRegularExpression = string.Empty;
Label_016C:
... //Other stuff
Run Code Online (Sandbox Code Playgroud)
我听说所有的"你都不会因为害怕流亡到永恒的地狱而使用goto".我总是高度重视MS编码员,虽然我可能不同意他们的所有决定,但我始终尊重他们的推理.
那么 - 这样的代码是否有充分的理由让我失踪?这个代码提取是由一个不合格的开发人员组装而成的吗?或.NET反射器返回不准确的代码?
我希望有是一个很好的理由,而我只是一味地失踪了.
感谢大家的投入
首先,我要说我同意goto语句在很大程度上与现代编程语言中的更高级别结构无关,并且在适当的替代品可用时不应使用.
我最近重新阅读了Steve McConnell的Code Complete原版,并忘记了他对常见编码问题的建议.几年前,当我第一次开始时,我已经读过它,并且不认为我意识到配方会有多么有用.编码问题如下:执行循环时,您经常需要执行循环的一部分来初始化状态,然后使用其他逻辑执行循环,并使用相同的初始化逻辑结束每个循环.一个具体的例子是实现String.Join(delimiter,array)方法.
我想每个人第一个接受这个问题的都是这个.假设定义了append方法以将参数添加到返回值.
bool isFirst = true;
foreach (var element in array)
{
if (!isFirst)
{
append(delimiter);
}
else
{
isFirst = false;
}
append(element);
}
Run Code Online (Sandbox Code Playgroud)
注意:稍微优化一下就是删除else并将其放在循环的末尾.赋值通常是单个指令并等效于else,并将基本块的数量减少1并增加主要部分的基本块大小.结果是在每个循环中执行一个条件以确定是否应该添加分隔符.
我也看到并使用了其他处理这个常见循环问题的方法.您可以先在循环外执行初始元素代码,然后从第二个元素到结尾执行循环.您还可以将逻辑更改为始终附加元素然后添加分隔符,一旦完成循环,您只需删除添加的最后一个分隔符.
后一种解决方案往往是我更喜欢的解决方案,因为它不会复制任何代码.如果初始化序列的逻辑发生变化,您不必记得在两个地方修复它.然而,它需要额外的"工作"来做某事然后撤消它,至少导致额外的cpu周期,并且在很多情况下,例如我们的String.Join示例也需要额外的内存.
我兴奋地阅读这个结构
var enumerator = array.GetEnumerator();
if (enumerator.MoveNext())
{
goto start;
do {
append(delimiter);
start:
append(enumerator.Current);
} while (enumerator.MoveNext());
}
Run Code Online (Sandbox Code Playgroud)
这样做的好处是,您没有重复的代码,也没有额外的工作.你开始循环进入第一个循环的执行的一半,那就是你的初始化.您只能使用do while构造模拟其他循环,但转换很容易并且阅读并不困难.
所以,现在问题.我很高兴尝试将其添加到我正在处理的一些代码中,发现它不起作用.在C,C++,Basic中工作得很好但是在C#中你不能跳转到不是父范围的不同词法范围内的标签.我很失望.所以我想知道,在C#中处理这个非常常见的编码问题(我主要在字符串生成中看到它)的最佳方法是什么?
或许更具体的要求:
我认为可读性是唯一可能因我说的配方而受到影响的事情.但它在C#中不起作用,那么下一个最好的东西是什么?
*编辑* 由于一些讨论,我改变了我的表现标准.性能通常不是限制因素,所以更正确的目标应该是不合理,不是最快的.
我不喜欢我建议的替代实现的原因是因为它们要么重复代码,这留下了改变一个部分而不是另一个部分的空间,或者对于我通常选择它的那个需要"撤消"操作,这需要额外的思考和时间来撤消事物你做的那件事.特别是对于字符串操作,这通常会让您因一个错误而打开,或者无法解释一个空数组并尝试撤消未发生的事情.
在研究退出嵌套循环的方法后,我决定尝试使用goto,
private void example()
{
for (int i = 0; i < 100; i++)
{
for (int ii = 0; ii < 100; ii++)
{
for (int iii = 0; iii < 100; iii++)
{
goto exitMethod;
}
}
}
exitMethod:
}
Run Code Online (Sandbox Code Playgroud)
但由于某种原因,如果我把goto标签放在方法的最后,Visual Studio 2012(Ultimate)会抱怨(并且它不会编译),

但是,如果我将代码更改为此,
private void example()
{
for (int i = 0; i < 100; i++)
{
for (int ii = 0; ii < 100; ii++)
{
for (int iii = 0; iii …Run Code Online (Sandbox Code Playgroud) 以下2个C#片段之间的执行存在差异吗?
do
{
Console.WriteLine(x.ToString());
++x;
}
while (x < 7);
Run Code Online (Sandbox Code Playgroud)
和
label:
{
Console.WriteLine(x.ToString());
++x;
}
if (x < 7) goto label;
Run Code Online (Sandbox Code Playgroud)
我想弄清楚为什么这么糟糕.谢谢.
编辑:如果我添加括号,片段非常相似.
EDIT2:在Visual Studio中,我点击了Go to Disassembly,我得到以下代码:
do
{
00000037 nop
Console.WriteLine(x.ToString());
00000038 lea ecx,[ebp-40h]
0000003b call 63129C98
00000040 mov dword ptr [ebp-48h],eax
00000043 mov ecx,dword ptr [ebp-48h]
00000046 call 63148168
0000004b nop
++x;
0000004c inc dword ptr [ebp-40h]
}
0000004f nop
while (x < 7);
00000050 cmp dword ptr [ebp-40h],7
00000054 setl al
00000057 movzx eax,al
0000005a mov …Run Code Online (Sandbox Code Playgroud) 我是C#的新手,现在正在研究控制台应用程序,我编写了以下代码:
Program.cs中
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Ch06Ex01
{
class Program
{
static void Write()
{
Console.WriteLine("Please enter any string..!!");
}
static void Main(string[] args)
{
Write();
string name = Console.ReadLine();
Write();
string name1 = Console.ReadLine();
Write();
string name2 = Console.ReadLine();
Write();
string name3 = Console.ReadLine();
Console.WriteLine("{0}, {1}, {2}, {3}",name,name1,name2,name3);
Console.WriteLine("enter \"y\" to restart the program and \"n\" to exit the Program");
string selectedOption = Console.ReadLine();
if (selectedOption == "y")
{
// howto call …Run Code Online (Sandbox Code Playgroud) 我有一个子程序.它可以确定值是否为空,然后执行某些操作.例如,如果它们为空,则会引发警告.代码工作正常.但是当值不为空时,警告仍然会弹出.请帮我纠正逻辑.
谢谢.
private void btnNew_Click(object sender, EventArgs e)
{
try
{
if (txtbox1.Text.ToString().Trim() == string.Empty)
{
goto Msg1;
}
if (txtbox2.Text.ToString().Trim() == string.Empty)
{
goto Msg2;
}
DataRow dr = mydataSet.Tables[0].NewRow();
dr["Descript"] = txtbox1.Text;
dr["Abbr"] = txtbox2.Text;
dr["SortOrder"] = Convert.ToDecimal(numericOrder.Value);
if (SortOrders.Contains((decimal)dr["SortOrder"]))
{
goto Msg3;
}
mydataSet.Tables[0].Rows.Add(dr);
dgv.DataSource = mydataSet.Tables[0];
Msg1:
MessageBox.Show("Description is required.");
Msg2:
MessageBox.Show("Abbr is required.");
Msg3:
MessageBox.Show("Please select another one, this one is already used.");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
Run Code Online (Sandbox Code Playgroud)
从上面的代码中,你看到了.如果txtbox1有一些值,程序仍会显示Msg1.我想避免它.
大家好昨天我发了一个问题:像c#allow; ; ; ; ; ; ; ; ; ; ; ; (C#空声明)
并找到答案:https://stackoverflow.com/a/20551989/2218635
但是今天我又看到了一个有趣的(bug)
见下图

为什么visual studio允许这个?代码构建成功.为什么要构建?
另一个有趣的代码总是运行
private void install()
{
http://www.stackoverflow.com
return;
}
Run Code Online (Sandbox Code Playgroud)
编辑:
看上面的方法是一个void方法,我知道void方法不返回.但为什么没有显示任何错误?而且我没有为" http://www.stackoverflow.com " 指定任何变量.但为什么它不会给我一个错误?