相关疑难解决方法(0)

在vb.net中嵌套/退出

如何退出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)

vb.net for-loop nested-loops

118
推荐指数
3
解决办法
22万
查看次数

有没有理由在现代.NET代码中使用goto?

我刚刚在.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反射器返回不准确的代码?

我希望有一个很好的理由,而我只是一味地失踪了.

感谢大家的投入

.net c# goto

31
推荐指数
6
解决办法
4243
查看次数

在C#中处理"循环初始化"的其他方法

首先,我要说我同意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#中处理这个非常常见的编码问题(我主要在字符串生成中看到它)的最佳方法是什么?

或许更具体的要求:

  • 不要重复代码
  • 不要做不必要的工作
  • 不要比其他代码慢2到3倍
  • 可读

我认为可读性是唯一可能因我说的配方而受到影响的事情.但它在C#中不起作用,那么下一个最好的东西是什么?

*编辑* 由于一些讨论,我改变了我的表现标准.性能通常不是限制因素,所以更正确的目标应该是不合理,不是最快的.

我不喜欢我建议的替代实现的原因是因为它们要么重复代码,这留下了改变一个部分而不是另一个部分的空间,或者对于我通常选择它的那个需要"撤消"操作,这需要额外的思考和时间来撤消事物你做的那件事.特别是对于字符串操作,这通常会让您因一个错误而打开,或者无法解释一个空数组并尝试撤消未发生的事情.

c# goto initialization do-while

22
推荐指数
4
解决办法
1850
查看次数

为什么我不能在方法的末尾添加goto标签?

在研究退出嵌套循环的方法后,我决定尝试使用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)

c# for-loop goto nested-loops visual-studio-2012

13
推荐指数
2
解决办法
2512
查看次数

C#中的标签有什么用?

标签和GOTOs被认为是不好的做法,据我所知,没有理由在C#中使用它.

C#中的标签有什么用?

c#

9
推荐指数
3
解决办法
8597
查看次数

GOTO与DO WHILE差异

以下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# loops goto do-while

3
推荐指数
1
解决办法
515
查看次数

如何再次在类中调用"static void Main(string [] args)"

我是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)

.net c# console console-application

1
推荐指数
2
解决办法
8239
查看次数

转到c#及其用法

我有一个子程序.它可以确定值是否为空,然后执行某些操作.例如,如果它们为空,则会引发警告.代码工作正常.但是当值不为空时,警告仍然会弹出.请帮我纠正逻辑.

谢谢.

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#

0
推荐指数
1
解决办法
208
查看次数

C#代码允许有趣的语法,而且void方法也允许返回

大家好昨天我发了一个问题:像c#allow; ; ; ; ; ; ; ; ; ; ; ; (C#空声明)

为什么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 " 指定任何变量.但为什么它不会给我一个错误?

c# syntax return visual-studio

-3
推荐指数
1
解决办法
168
查看次数