Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么';tc#允许循环上的else子句吗?_C#_.net_Loops - Fatal编程技术网

为什么';tc#允许循环上的else子句吗?

为什么';tc#允许循环上的else子句吗?,c#,.net,loops,C#,.net,Loops,今天我决定学习一些Python(IronPython)语法。在这样做的过程中,我对一个允许循环的构造印象深刻 Python在其循环上支持else子句。循环中的else基本上是这样说的,“如果此循环正常完成,则输入此子句” 请允许我演示如何使用C 此代码: Something something = SomeCallToSetThisUp(); bool isCompatable = false; foreach (Widget widget in widgets) { isCompatab

今天我决定学习一些Python(IronPython)语法。在这样做的过程中,我对一个允许循环的构造印象深刻

Python在其循环上支持
else
子句。循环中的
else
基本上是这样说的,“如果此循环正常完成,则输入此子句”

请允许我演示如何使用C

此代码:

Something something = SomeCallToSetThisUp();
bool isCompatable = false;
foreach (Widget widget in widgets)
{
   isCompatable = widget.IsCompatableWithSomething(something);

   if (!isCompatable)
      break;
}
if (isCompatable)
   compatableSomethings.Add(something);
可能成为此代码(无效C#):

我从来没有见过这个,这让我觉得很酷。一旦你学会了,它看起来就像我见过的任何代码一样可读

虽然不是普遍需要的(有时你想影响列表中的每一项),但我确实认为它是有用的

所以,我的问题是:为什么这不在C中?

我有一些想法,为什么:

  • break
    会使调试更加困难,因此设计者不想鼓励它
  • 并非所有闪亮的东西都能融入语言。(范围有限)

但这些只是猜测我问的是一个实际的规范原因

通常的答案是因为没有人要求它,或者开发和维护它的成本超过了它的好处

来自Eric Lippert的博客:

我已经多次链接到Eric Gunnerson关于 C#设计过程。Eric帖子中最重要的两点 它们是:(1)这不是一个减法过程;我们不是从C++开始的 然后决定是否保留它们的某些特性 出来(2)仅仅是一个好的特性是不够的。功能必须 要有足够的说服力,使其值得付出巨大的成本 设计、实施、测试、记录和运输 特色。他们必须付出使语言复杂化的代价 并且使将来设计其他功能更加困难

我们在最后一刻完成了对整个系统各个部分的小规模重新设计 C#3.0,我们列出了我们能想到的所有可能的功能 可能会进入C#的未来版本。我们花了很多很多时间 浏览列表中的每一项功能,尝试“bucket”它。每个 功能被放入一个独特的桶中。桶上贴有标签:

Pri 1:在下一版本中必须具有

Pri 2:在下一个版本中应该有

Pri 3:很高兴在下一个版本中有

Pri 4:可能需要多年的深入研究才能做到这一点

Pri 5:坏主意

很明显,我们立即停止考虑四分和五分 下一版本的上下文。然后我们把这项工程的费用加起来 将前三个铲斗的特点与设计进行比较, 实施、测试和记录我们现有的资源。 成本大大高于可用资源,因此我们 把第二桶和第三桶里的东西都砍掉,把桶里的东西砍掉一半 1.事实证明,其中一些“必须拥有”实际上是“应该拥有”

了解这种扣合过程将有助于我谈论一些 在那个长长的论坛主题中建议的功能之一。许多 建议的功能非常好,但落在了第三桶里。他们 没有弥补100分的差距,他们只是没有说服力 够了

此外,您需要权衡现有/新开发人员是否容易理解该特性。IMHO
else
on循环的可读性不是很好,特别是因为“如果前一个块完成,则执行此块”的关键字是
finally


更重要的是,我认为
是可枚举的。任何
/
都是可枚举的。在这种情况下,所有的
方法都要好得多。

因为for else循环是对python等语言的攻击。如果你觉得你需要一个After循环,你可能应该把代码放在一个单独的函数中。

循环收集并检查一个条件是不同的,所以它们应该是分开的语言构造。java/C++,Java,或者任何其他C语言,我也知道。另外,对我来说,

“如果这个循环正常完成,那么输入这个子句”
听起来和我期望的正好相反。问一个语言为什么没有按照你设计的那样设计,这不是一个好问题。我一直认为这很好,但我更喜欢
,最后是
,而不是
else
,这在C#中可能意味着“如果我的
foreach
没有任何迭代”。我喜欢这个功能,但使用关键字
else
这是一个可怕的设计选择。尽管我知道它的意思,但我还是立即将其解读为“如果从未进入循环,则执行此操作”。单身。时间。再多解释一下就好了:它实际上是一个非常方便的构造,用例时不时出现。
Something something = SomeCallToSetThisUp();
foreach (Widget widget in widgets)
{
   if (!widget.IsCompatableWithSomething(something));
      break;
}
else
   compatableSomethings.Add(something);