为什么在使用“注释选择”注释多行选择时,Visual Studio会采用单行注释?

时间:2015-08-06 15:12:25

标签: c# .net visual-studio comments

我一直想知道关于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 个答案:

答案 0 :(得分:4)

这样做会有一些问题:

如果任何代码行中都有>>> import random >>> def hwset(m, n): ... return random.sample(xrange(1, m + 1), n) ... >>> hwset(100, 5) [25, 58, 2, 29, 57] >>> hwset(100, 5) [84, 55, 80, 65, 47] >>> sorted(hwset(100, 5)) [1, 25, 77, 81, 92] >>> sorted(hwset(100, 5)) [34, 46, 59, 66, 76] ,那么它就无法运作:

*/

评论:

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/*");
}
/*

这样做的好处是代码几乎是1:1之前的样子,只是前缀为//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 :(得分:0)

有人向我描述了多行注释是来自C的工件,并且大多数C#程序员更喜欢使用//样式的注释。

如果在嵌套结构中多次使用多行样式/**/会变得混乱,因此比单行对应更容易出错。 See this question了解更多信息。

答案 2 :(得分:0)

多行注释在C#中已更改但未在VS IDE中实现,您可以创建自己的方式或查找扩展名。 C#现在使用/ ** * /进行多行注释,并且还有各种内置规则来说明它是如何工作的。 请看这个链接:https://msdn.microsoft.com/en-us/library/5fz4y783.aspx