为啥在使用“评论选择”评论多行选择时,Visual Studio 会诉诸单行评论?
Posted
技术标签:
【中文标题】为啥在使用“评论选择”评论多行选择时,Visual Studio 会诉诸单行评论?【英文标题】: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 + 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();
//
我觉得分隔注释格式在最后一种情况下更合适,因为规范说:
单行 cmets 延伸到源代码行的末尾。 分隔的 cmets 可以跨越多行。
有谁知道为什么在 Visual Studio 中评论 多行选择 时选择此格式作为默认格式?
【问题讨论】:
不确定文档是否对此给出了任何解释,但我猜这是为了让以后更容易取消注释部分选择。例如,如果您决定只取消注释方法声明和大括号,但希望将单独的语句注释掉。 我同意@BoltClock。注释后,您可以取消注释每一行而不影响其他行。它更容易。 此外,作为一般(非特定语言)规则,这更好,b/c 某些语言(如 Scss)仍然处理多行注释中的代码,您可能想要实际注释(例如文档 cmets),但您在注释 out 代码时可能不想要。 【参考方案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 了解更多信息。
【讨论】:
以上是关于为啥在使用“评论选择”评论多行选择时,Visual Studio 会诉诸单行评论?的主要内容,如果未能解决你的问题,请参考以下文章
Visual Studio C++ 切换评论?评论而不选择整行?
开源 免费 java CMS - FreeCMS2.0 会员我的评论