为什么使用“注释选择”时,Visual Studio要采用单行注释而不是多行注释?

6

在 Visual Studio 中,有一个关于“注释选定内容”的小问题一直让我感到疑惑(快捷键为 Ctrl + K, Ctrl + C)。

当我对这个方法的实现进行注释时,使用的是单行注释格式。

private void Foo()
{
    //Bar b = new Bar();
}

当我在这里注释构造函数的参数(部分行)时,使用的是分隔符注释格式。

private void Foo(Qux q)
{
    Bar b = new Bar(/*q*/);
}

当注释掉整个方法时,会导致以下结果:
//private void Foo()
//{
//    Bar b = new Bar();
//}

我觉得在最后一种情况下,使用分隔符注释格式会更合适,因为规范说:

单行注释延伸到源代码行的末尾。 分隔符注释可以跨越多行。

有人知道为什么在Visual Studio中注释多行选择时选择了这个作为默认格式吗?


3
不确定文档是否对此进行了解释,但我猜想这是为了方便稍后取消部分选定内容的注释。例如,如果您决定取消对方法声明和大括号的注释,但想保留单个语句的注释状态。 - BoltClock
1
我同意@BoltClock的观点。在注释后,您可以取消注释每一行而不影响其他行。这样更容易些。 - M.kazem Akhgary
此外,作为一般的(非特定语言)规则,这样做更好,因为某些语言(如Scss)仍会处理多行注释中的代码,而您可能希望将其用于实际注释(例如文档注释),但在您注释掉代码时,您可能不想要这些代码。 - jbyrd
3个回答

9

这样做会有几个问题:


如果任何代码行中有一个*/,它就无法工作:

private void Foo(Qux q)
{
    //we use "*/image/*" flag here to find only images
    Bar b = new Bar("Some wildcard: */image/*");
}

评论到:

/*
private void Foo(Qux q)
{
    //we use "*/image/*" flag here to find only images
    Bar b = new Bar("Some wildcard: */image/*");
}
*/

如果您在已包含分隔符注释的部分上使用“注释选择”,那么尝试使用分隔符注释包装代码将不起作用:
/*
private void Foo(Qux q)
{
    /* Some multiline 
     * comment
     */
    Bar b = new Bar();
}
*/

但是,我们可以通过插入多个分隔符注释和单行注释的组合来解决这个问题。
/*
private void Foo(Qux q)
{
    /* Some multiline 
     * comment
*/
//   */
/*
    Bar b = new Bar();
}
*/

有点丑,但它起作用。如果你看到了那些被注释的代码,你能立即识别出哪些是代码部分,哪些是注释部分吗?此外,如果你点击“取消注释”命令,你会知道你将得到什么吗?
更进一步,想象一下,如果你注释这个注释,它会变得更加丑陋和难以阅读。
在我看来,如果你的文本中有*/,并且你要对其进行注释,那么解决/转义注释甚至会变得更糟:
private void Foo(Qux q)
{
    //we use "*/image/*" flag here to find only images
    Bar b = new Bar("Some wildcard: */image/*");
}

转换为:

/*
private void Foo(Qux q)
{
    //we use "**//*/image/*" flag here to find only images
    Bar b = new Bar("Some wildcard: **//*/image/*");
}
/*

将上述令人困惑的注释代码与现有的单行实现进行比较:
//private void Foo(Qux q)
//{
//    /* Some multiline 
//     * comment
//     */
//    Bar b = new Bar();
//}

//private void Foo(Qux q)
//{
//    //we use "*/image/*" flag here to find only images
//    Bar b = new Bar("Some wildcard: */image/*");
//}

这样做的好处是代码几乎与之前完全一致,只是前缀添加了//字符。仍然能够完全阅读,并且如果您进一步注释或取消注释,它将完全可预测。嵌套单行注释或嵌套分隔符注释也没有任何问题。


也许最终,从IDE的角度来看,实现起来非常简单:“评论选择”意味着在每行添加一个//前缀,“取消选择”意味着删除前面的//。不需要破解代码/注释,或破解错误语法代码/注释。


1

有人告诉我,多行注释是从C语言遗留下来的产物,大多数C#程序员更喜欢使用//风格的注释。

如果在嵌套结构中多次使用多行注释样式/**/,可能会变得混乱,因此比单行注释更容易出错。请参见此问题以获取更多信息。


0

在C#中,多行注释已经发生了变化,但尚未实现到VS IDE中,您可以自己创建一种方式或查找扩展程序。C#现在使用/** */来表示多行注释,并且还有各种内置规则来控制其工作方式。 请参阅此链接:https://msdn.microsoft.com/zh-cn/library/5fz4y783.aspx


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