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

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

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

单行注释扩展到源代码行的末尾。 定界注释可能跨越多行。

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

这样做会有一些问题:


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

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

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


也许最后,从IDE的角度来看实际上非常简单:“注释选择”意味着在每行添加一个//前缀,“取消注释选择”意味着删除前面的// 。 解析代码/注释或解析不正确的语法代码/注释没有任何问题。

据我所知,多行注释是来自C的工件,并且大多数C#程序员更喜欢使用//注释风格。

如果在嵌套结构中多次使用多行样式/**/会变得混乱,因此比单行对应更容易出错。 有关更多信息, 请参阅此问题 。

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