【问题标题】:Why does Visual Studio resort to single-line comments when commenting a multi-line selection with "Comment Selection"?为什么在使用“评论选择”评论多行选择时,Visual Studio 会诉诸单行评论?
【发布时间】:2015-10-29 19:41:35
【问题描述】:

我一直想知道的关于 Visual Studio 中的 注释选择 选项的一些小问题(Ctrl + KCtrl + 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();
//}

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

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

有谁知道为什么在 Visual Studio 中评论 多行选择 时选择此格式作为默认格式?

【问题讨论】:

  • 不确定文档是否对此给出了任何解释,但我猜这是为了让以后更容易取消注释部分选择。例如,如果您决定只取消注释方法声明和大括号,但希望将单独的语句注释掉。
  • 我同意@BoltClock。注释后,您可以取消注释每一行而不影响其他行。它更容易。
  • 此外,作为一般(非特定语言)规则,这更好,b/c 某些语言(如 Scss)仍然处理多行注释中的代码,您可能想要实际注释(例如文档 cmets),但您在注释 out 代码时可能想要。

标签: c# .net visual-studio comments


【解决方案1】:

多行注释在 C# 中已更改,但未在 VS IDE 中实现,您可能可以创建自己的方式或找到扩展。 C# 现在将 /** */ 用于多行 cmets,并且还有各种关于其工作方式的内置规则。 看这个链接:https://msdn.microsoft.com/en-us/library/5fz4y783.aspx

【讨论】:

    【解决方案2】:

    这样做会有一些问题:


    如果任何代码行中有一个*/,它就不起作用:

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

    但是很好,我们可以通过插入多个分隔的 cmets 和单行 cmets 的组合来解决这个问题:

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

    有点难看,但它有效。如果您遇到该注释代码,您是否能够立即识别代码部分和注释部分是什么?此外,如果你点击“取消注释选择”命令,你会知道你会得到什么吗?

    更进一步,想象一下,如果你评论这条评论,它会变得更加丑陋和难以阅读。


    如果您在注释掉的文本中有*/,则解决方法/逃避 cmets 会变得更糟(在我看来):

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

    这样做的好处是代码几乎是 1:1 与之前的样子完全相同,只是以 // 字符为前缀。如果您进一步评论或取消评论,它仍然完全可读并且仍然完全可以预测它会是什么样子。嵌套单行 cmets 或嵌套分隔 cmets 没有任何问题。


    也许最后,从 IDE 的角度来看,实现起来真的很简单:“注释选择”意味着在每一行添加一个 // 前缀,“取消注释选择”意味着删除前面的 @987654332 @。无需处理解析代码/cmets,或解析不正确的语法代码/cmets。

    【讨论】:

      【解决方案3】:

      据我描述,多行注释是 C 语言的产物,大多数 C# 程序员更喜欢使用 // 样式的注释。

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

      【讨论】:

        猜你喜欢
        • 2011-05-20
        • 2016-12-15
        • 1970-01-01
        • 2011-05-03
        • 1970-01-01
        • 1970-01-01
        • 2021-03-01
        • 2017-06-30
        • 2012-04-16
        相关资源
        最近更新 更多