C#中是否有类似Python或Haskell的显著空白?

8 投票
9 回答
1461 浏览
提问于 2025-04-15 15:37

我在想,其他C#开发者是否会觉得,如果有一个编译器指令可以让空格变得重要,就像Haskell或Python那样,空格的不同可以用来创建代码块,那会不会更好。

虽然这和C语言风格的语言有很大的不同,但我觉得C#最终是编译成CIL(公共中间语言),而CIL依然需要大括号和分号,所以这其实只是编译器处理的一种方式(也就是说,编译器可以选择是否把空格当回事)。因为大括号和分号常常让新手觉得难以入门,而它们其实只是帮助解析的工具(本身并不赋予代码意义),所以可以像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#开发者已经习惯了这种语法,以至于他们可能看不到它有多么不自然(尽管最终可能会让代码更容易阅读)。

9 个回答

3

作为一个主要使用Python的开发者,我希望更多的编程语言能像Python一样,使用空白字符来区分代码块。

如果你去查查相关讨论组,你会发现很多C、C++、C#、Java等语言的开发者都有自己的看法。我感觉他们中的很多人其实很喜欢用大括号。

不过,如果各种风格混在一起,那可就麻烦了。

我也经常使用带大括号的语言,所以我能理解两种风格的优缺点。

11

如果你想要这样的语法,为什么不直接使用 IronPython 或者 Boo 呢,而非C#?

与其去调整C#,不如为这个目的实现一种自定义的语言。正如你所说,它们最终都会编译成相同的IL(中间语言),所以没有必要为了实现一个本质上是新语言语法的东西,而去改变一个已经很好、干净的工作语法。

3

你可能会对Kirill Osenkov的论文感兴趣,《设计、实现和集成一个结构化的C#代码编辑器》

这篇论文的核心思想是,虽然大括号是C#语言的一部分,但你的编辑器并不一定要显示它们。Osenkov为SharpDevelop实现了一个编辑器控件,它通过缩进来表示大括号的配对,这样程序员在处理代码结构时会更快。想要看到一个很好的例子,可以跳到链接文档的第113页。

撰写回答