关于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();
//}
我觉得在最后一种情况下定界注释格式会更合适,因为该规范说:
Single-line comments extend to the end of the source line. Delimited comments may span multiple lines.
有谁知道为什么在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的角度来看,它的实现非常非常简单:“注释选择”意味着向每行添加//前缀,“注释取消”意味着删除前一个//.绝不嘲笑解析代码/注释,或者解析不正确的语法代码/注释.