gpt4 book ai didi

c# - 过度使用 break 语句的解决方案?

转载 作者:太空宇宙 更新时间:2023-11-03 10:29:52 25 4
gpt4 key购买 nike

我有一个功能完备的程序,现在我正在重构它。我只是在学习 c# 的过程中,所以尽管它运行得很好,但原始代码非常糟糕。该程序的要求之一是用户能够随时返回主菜单。我是这样完成的:

static bool bouncer = false
static void Exit(string input)
{
if (input == "\t")
{
bouncer = true
}
}
static string Prompt(string msg)
{
// takes input and passes it to Exit() then returns the input
}
static string FunctionA()
{
while(true)
{
if (bouncer == true)
{
break;
}
Prompt("whatever")
if (bouncer == true)
{
break;
}
Prompt("whatever")
if (bouncer == true)
{
break;
}
// return some stuff
}
}
static void Main()
{
bouncer = false
// writes the menu to console and handles UI
// FunctionA
{

如果用户在任何输入点输入“tab”字符,变量 bouncer 将设置为 true。 break 语句条件的激增提供了实际跳回 Main() 的结构。这显然不是一个很好的解决方案,它会使代码难以阅读。

我认为完成相同任务的其他尝试是:

  1. 直接跳回 Main() 的 Goto 语句。我放弃了这个,因为 goto 在 c# 中的范围非常有限,而且我认为没有任何好的方法可以让它在这种情况下可行。

  2. 直接从 Exit() 调用 Main()。这可能是个坏主意,而且我无论如何也不能这样做,因为显然 Main() 以某种方式受到“保护”。

  3. 使用事件对按下的 TAB 或 ESC 使用react。我不清楚如何使用事件来执行此操作,因为我仍然无法立即脱离事件。我的理解是 break 语句实际上必须包含在需要中断的循环中,而不是写入从循环内调用的不同函数中。

非常感谢任何建议。我希望在事件处理方面有所作为,或者我忽略了一些更简单的事情。谢谢!

最佳答案

作为编码风格的问题,它的工作方式是有效的,但被认为是丑陋的。遗憾的是,如果您需要在工作的各个部分之间立即中断,则没有很多解决方法。

您可以将当前使用中断的格式更改为使用“if( bContinue ) {/* do next section of work */} ”控制样式。它将代码从 while 循环的中断更改为:

static string FunctionA()
{
bool bContinue = true;
while( true == bContinue )
{
// Do initital work.
//
// Initial work can set bContinue to false if any error condition
// occurs.

if( true == bContinue )
{
// Do more work.
int returnCheck = MakeACall(); // Presume MakeACall returns negative interger values for error, 0 or positive values for success or success with condition/extra information.
if( 0 < returnCheck )
{
bContinue = false;
}
}

if( true == bContinue )
{
Prompt("whatever")
// Do more work.
bContinue = MakeASecondCall(); // Presume that MakeASecondCall returns true for success, false for error/failure
}

if( true == bContinue )
{
Prompt("whatever")
// Do more work.
// If error encountered, set bContinue to false.
}

if( true == bContinue )
{
Prompt("whatever else")
// Do more work.
// If error encountered, set bContinue to false.
}

// Done with loop, so drop out.
bContinue = false;
// return some stuff
}
}

看看你的伪代码,它读起来就像你只通过你的工作循环一次。如果是这样,您可以切换到 Do-While(false) 格式,并使用 break 仅下降到底部。或者,如果您只对 FunctionA 进行单次传递,则只需取消 WhileDo-While 控制结构,而只是使用 if(true==bContinue){/* 做更多工作 */}。它不是最干净的代码,但是当您执行长时间的串行工作时,如果您不打算使用 whiledo-while,您最终会得到这样的结构> 用于控制流量。

使用 if(bContinue){} 风格的缺点是,当在流程的早期阶段出现错误情况时,代码不会像break 跳出 while()do-while() 结构如果错误发生在工作的顶部附近,因为会有代码将测试然后跳过的一系列 if 语句。但它是可读的,如果您为控制变量使用描述性名称(即 nContinuebContinueworkLoopControl),它应该相当很明显,对于在您之后工作或审查代码的任何人,它是函数工作流的主控制标志。

关于c# - 过度使用 break 语句的解决方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30580556/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com