为什么';tc#允许循环上的else子句吗?
今天我决定学习一些Python(IronPython)语法。在这样做的过程中,我对一个允许循环的构造印象深刻 Python在其循环上支持为什么';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
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);