C#中是否有像Python或Haskell一样的显著空白符?

8

我想知道其他C#开发人员是否认为,为csc.exe添加编译器指令以使空格在代码块中具有类似Haskell或Python的重要性是否会有所改进。

虽然这显然是与C-style语言大相径庭,但我认为由于C#最终被编译成CIL(它仍将具有花括号和分号),因此这只是编译器可以处理的一种解析技巧(即它可以处理重要的空格或不处理)。由于花括号和分号通常是C#入门的障碍,而且它们只是解析助手(它们本身并不赋予代码含义),因此它们可以像Haskell/Python一样被删除。

F# 使用 #light 编译器指令来处理这个问题,你可以在 F# 1.1.12.3中的轻量级语法选项中了解它。

我希望在 C# 中也能看到这样的东西:一个 #SigSpace 或类似的指令,可以让 csc.exe 根据空格将源代码视为像 Haskell 文件那样进行处理(只是举个例子)。

标准的 C#:

public void WhiteSpaceSig()
{
    List<string> names = new List<string>();
    List<string> colors = new List<string>();

    foreach (string name in names)
    {
        foreach (string color in colors)
        {
            // bla bla bla
        }
    }
}

显著的空白:

#SigSpace

    public void WhiteSpaceSig()

        List<string> names = new List<string>()
        List<string> colors = new List<string>()

        foreach (string name in names)
            foreach (string color in colors)
                // bla bla bla

我不是说我想用C#做这件事,但我很感兴趣了解其中的权衡。我猜大多数C#开发人员已经习惯了语法,以至于他们看不出它有多么不自然(尽管最终可能使代码更易于阅读)。


2
如果我想要编写/阅读那样的代码,我会使用Python。这可能对你很酷,但其他开发人员可能会发现它非常不标准。 - Byron Whitlock
1
你不再需要在 F# 中使用 "#light",因为它已经成为默认设置。 - Brian
1
"我担心你在这里有一个严重的误解。C#被编译成IL字节码,它只是一系列操作码等。在那个层面上没有花括号和分号(即使有,它们对于在C#级别编写代码的开发人员也没有帮助)。即使是ILASM文本格式的IL,在许多C#级别结构中也不使用花括号或分号,例如循环,因为它使用跳转而不是块 - 而且如果它确实这样做,那对于C#编码人员仍然是无关紧要的。" - itowlson
1
C#是花括号家族中的一种语言,特别设计成这样(以便人们更容易从C++和Java迁移)。这仍然是一个有效和合理的设计目标。事实上,它最初被称为COOL - “类C”的面向对象语言。如果你想在.NET上使用显著的空格和强类型检查,为什么不使用F#?或Boo。或Nemerle... - Pavel Minaev
1
这是一个很棒的想法。它可以节省大量重复输入的工作。不幸的是,你可能会遇到很多盲从的程序员反对,他们不合理地喜欢花括号。而且,这并不等同于简单地使用Python,因为像C#这样的编译语言会有验证和性能的改进。但正如其他人所说,.NET平台上有重要的空格语言可用。 - Cerin
显示剩余4条评论
9个回答

11
如果你想要这种语法,为什么不使用IronPythonBoo而不是C#呢?
似乎最好实现一个自定义语言来实现这个,而不是试图调整C#。正如你所说,它们都编译成相同的IL,因此没有理由改变一个良好、干净、工作良好的语法来实现本质上是一个新语言语法的东西。

3
作为一名主要使用Python的开发者,我希望能看到更多语言采用显著的空格来分隔代码块。
如果您搜索新闻组,您会发现C、C++、C#、Java等开发人员有很多意见。我的感觉是,他们中的许多人真的喜欢花括号。
然而,混合不同风格的语言会很麻烦。
我也经常使用花括号语言,所以我可以理解双方的立场。

2
你会,而我不会。我觉得这很烦人,似乎高度主观。 - Ed S.

3
您可能会对 Kirill Osenkov 的论文感兴趣,该论文的题目是“设计、实现和集成一个结构化的 C# 代码编辑器”。(链接:Designing, implementing and integrating a structured C# code editor)。
其基本思想是,尽管大括号是 C# 语言的一部分,但您的编辑器并不一定要将它们显示给您。Osenkov 为 SharpDevelop 实现了一个编辑器控件,将大括号配对作为缩进表示,并使程序员更快地处理代码结构。请跳转到链接文档的第113页以查看一个很好的示例。

2

没有花括号会让读者陷入歧义的可能性。人类并不擅长区分不同种类的空格(想一想,"不同种类的空格"!)。而且说到人类,我也包括在内。这就是为什么我喜欢C#的原因。

有些语言背后有哲学观念,支持某些类型的歧义。但C#不是这样的语言。


我不知道有任何使用不同种类空格的Python开发人员。你知道吗?我认为这是一个虚构的问题。 - John La Rooy
@gnibbler 制表符、空格和换行符都是空白字符。 - Rex M
3
@Rex,你有区分空格和换行符的困难吗? - John La Rooy
1
@Rex,我对花括号没有任何意见 - 请看我在这里的回答,我只是不明白为什么人们会感到强烈要求必须使用它们。我更愿意选择一种更适合我正在解决的问题的语言。对我来说,语法次于语义。 - John La Rooy
3
作为一名有10年经验的Python程序员,我无法忍受那些强制我键入冗余作用域标记的语言。任何合格的程序员都已经使用空白符来逻辑化格式化他们的代码。省略花括号是下一个合乎逻辑的步骤。对花括号的依赖只是从以前不那么富有想象力的语言中保留下来的模仿而已。 - Cerin
显示剩余2条评论

2

我想不出比这更糟糕的事情了!

特别是有两个选项的时候。每次阅读别人的代码时,你都必须熟悉两种符号才能理解它,如果他们在两者之间切换,那就更可怕了!

这将消除所有一致性,并导致许多开发人员大喊WTFS。

然后还有关于空格和括号的整个神圣战争 - 我甚至不想评论。


1

我整个职业生涯都是C# / Java开发人员,看到有大量空格的C#代码会让我疯掉。

如果你熟悉括号,它可以使代码更易读,并真正帮助你弄清楚代码在做什么。


0

那不会是C#,它将是一种不同的语言,比如Iron Python


2
你把语法和语义混淆了。 - John La Rooy
2
不是的 - 语法是构成一种语言的重要部分。 - Pavel Minaev

0
如果有选择的话,我永远不会使用它。
具体来说,我喜欢Visual Studio解析花括号的方式,允许块折叠/展开,将插入符号放在花括号旁边会突出显示相应的闭合/打开花括号。
人类可读性也是一个问题。区分单词之间的花括号比区分空格更容易。

0

我在一家公司开发的编程语言上工作已经30多年了。我们经常在处理这样的问题。任何更改,甚至是添加,都不仅会引入改进的机会,还会引入错误和误解的机会。

即使在最好的情况下,这也解决不了任何问题。你只是用另一个任意的代码块标识符来交换,这将抵消任何收益(如果有新语法的话,这甚至还没有确定)。

更有可能的是,你正在用一个不太熟悉的规则集与一个众所周知、根深蒂固的规则集进行交换,从而引入错误和误解的机会。即使只是将其作为一个选项添加,也会增加出错的可能性,因为现在你可以用两种语法来编写相同的代码,甚至可能是同一个开发团队使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接