C#中的/*!*/是什么意思?

31

我是C#的新手,在阅读代码时遇到了一些看起来很奇怪的地方,比如类方法被定义为:

/*!*/
protected override OptionsParser/*!*/ CreateOptionsParser()
protected override void ParseHostOptions(string/*!*/[]/*!*/ args)

很遗憾,/*!*/无法在谷歌上搜索到。那它是什么意思?


4
好的,这很有趣。为什么会有人在那里发表这样的评论呢? - Stefano Borini
你在哪里看到这段代码的?是教程还是项目的一部分?或者是自动生成的代码? - ZoogieZork
你可能需要在你的前辈使用的编辑器中寻找原因。有时候,在奇怪的地方添加注释是为了规避高亮编辑器解析问题。(LPC及其#' - lambda语法曾经存在这种情况) - Leonidas
10
只是为了明确起见,就语言本身而言,它什么意义都没有。它只是一个包含感叹号的注释。但置于其中的程序员究竟指的是什么,这是一个好问题。 - jalf
我正在查看IronPython控制台代码,其中有许多这种类型的注释。 - Tristan
1
@DownVoter - 为什么你不说明评论被负评的原因呢?再说一遍,StackOverflow的开发人员们为什么不能添加谁给回答点了踩或强制性询问下投票原因呢? - JonH
7个回答

47

这可能是将Spec#风格的注解引入非Spec#构建的尝试。在Spec#中,!注解表示值不为空。作者可能想表明返回值、args数组和args中所有元素都是非空值。

Spec#链接:

Spec#概述:

Spec#是由微软研究项目创建的.Net语言。它是C#语言的扩展,试图将代码合同嵌入类型系统中,最突出的特点是非空类型(在类型名称后面用!表示)、检查的异常和前/后条件。


3
另一种方法是在该方法中加入 Contract.Ensures(Contract.Result<OptionsParser>() != null);,最好在相关文档中进行说明。这样做可以在保证原意不变的前提下,使内容更加通俗易懂。 - Sam Harwell
@JaredPar:可以填充更多细节吗?什么是#Spec-build?到目前为止,这似乎是唯一一个对正在发生的事情有线索的答案。 - jsbueno
@jsbueno,添加了Spec#的快速概述。不过最好的解释在我添加的链接里。那里可以找到非常详细的文档。 - JaredPar
@JaredPar,我没有给你点踩,但我真的很讨厌SO没有实现一种方法,即使在活动部分也无法看到谁给了负评,或者强制说明为什么会有负评。这种情况经常发生在我身上,当然,点踩者不解释。 - JonH
Spec# 是 C# 的一个超集,具有形式化规范的结构,并允许进行形式化静态验证(以及额外的运行时检查)。您可以注释掉 Spec# 特定的语言结构(如“!”-Types),然后得到有效的 C# 代码,这似乎在您的情况下就发生了。如需进一步了解,请参考 Jared 的链接。 - MartinStettner
@JonH:看看这个功能请求:http://meta.stackexchange.com/questions/37090/feature-request-downvoter-sends-a-notification-to-all-downvoters-for-your-post。尽早点赞,经常点赞 :-)。 - jason

19

这是一个包含 '!' 的注释。

任何被 /* */ 包围的内容都将被视为注释,在代码编译时会被忽略。


6

我不确定C#是否有特殊的标记,但是在任何支持开放/关闭、多行注释标记的语言中,我都会使用类似的技巧,以便能够通过单个字符更改来快速注释和取消注释多行代码:

/*!*/
this is live code (and will probably cause a compilation error)
/*!*/

/*!* /
this is commented code (and should never cause a compilation error)
/*!*/
< p >使用!的原因是因为像/**这样的结构是文档工具中常用的标记。

当语言支持单行注释标记//(并像C++和Java一样实现它们)时,还有其他技术:

///* - opening comments can be commented-out so what follows isn't a comment.
this is live code
//*/ - closing comment are not commented-out by single-line comments.

因此,您可以删除第一个单行注释标记//,以产生一种“切换”:

/* this is now commented.
this is also commented.
//*/ this line is live code.

+1:这并没有回答问题,但是这确实是一个非常巧妙的hack :-) - David Schmitt

1

这是一个带有'!'的注释。也许程序员想确保您注意到第一个方法返回了OptionsParser,而第二个方法接收了一个字符串数组,而不仅仅是一个字符串。

您可以删除它们,它们将继续正常工作 =)


1

这只是一个分隔注释;可能你的程序员只是标记了那些需要稍后讨论的点。


我曾听说有些人会每次发表回答时都习惯性地将其他所有回答都点踩 - 也许这就是此处的原因。 - Tom Bushell
1
这是stackoverflow的一个不好的地方 - 一个有心理障碍的人在这里可能会做出非常疯狂的事情。 - Phil
另一方面,人们可能会反对将“多行注释”用于一个字符的注释。 - David Thornley

0
/* is start comment
*/ is end comment

everything between is the comment
you can even tell that SO highlights that area as a comment

0

就像大家所说的那样,这是一条注释。此外,我认为 '!' 用于标记。它似乎有助于识别感兴趣的点,并起到了视觉上的作用。


这些括号确实很有趣! - jball

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接