这就是我找到的。
我认为在COM中二进制级别的名称是合法的是没有问题的,因为COM接口的名称是它的IID,而文本名称只是文档。
在.NET方面,相关的规范是通用语言基础结构规范(ECMA-335,http://www.ecma-international.org/publications/standards/Ecma-335.htm)。我不知道.NET或单声道是否加在上面自己的限制 - 这样做会减少互操作性,但这是真实的世界。
8.5.1节介绍了通用类型系统中的有效类型名称,并简单地说使用代码点比较名称。奇怪的是,它没有提到名称的组成,只是名称如何比较。这一节由MSDN在http://msdn.microsoft.com/en-us/library/exy17tbw%28v=VS.85%29.aspx中解释,它表示只有两个限制是:(1)类型名称“被编码为Unicode(16位)字符的字符串”,以及(2)它们不能包含嵌入的0x0000。
我已经引用了大约16位的Unicode,而不是解释它,因为它使用不精确的语言。推测该页面的作者是UTF-16。在任何情况下,ECMA-335指定逐字节比较,并且不提及Unicode(关于类型名称),也不禁止嵌入的零。也许.NET在这里偏离了CTS,尽管我怀疑它。更有可能的是,这个MSDN页面的作者在编写它时正在考虑编程语言。
公共语言规范(也定义在ECMA-335中)定义了源代码中标识符的规则。标识符与我的问题没有直接关系,因为我的内部类型名称永远不会出现在源代码中,但是我一直在研究它。 CLS是CTS的一个子集,因此它的限制不一定是更广泛的CTS的一部分。 CLS第4条规定,标识符必须遵循Unicode标准3.0技术报告15附件7的规定 - 请参阅http://www.unicode.org/reports/tr15/tr15-18.html。该文件也有点模糊,因为它指的是“其他字母”和“连接器标点符号”,但没有定义它们。这有助于:http://notes.jschutz.net/topics/unicode/。
ECMA规范的8.5.1节包含了一个非规范的注释,即CLS消费者(例如C#或Visual Studio类型的浏览器,我想)不需要使用违反CLS规则4的类型。“我的建议接口名称确实违反了本规则4.本文似乎暗示有效类型可能具有违反规则4的名称,并且CLS消费者应接受流氓名称或安全地忽略它。 (Visual Studio类型的浏览器毫无怨言地显示它。)
因此,我提出的类型名称在源代码中通常是非法的。但请注意,第10.1节(关于CLS中的标识符)指出:“由于其规则仅适用于导出到其他语言的项目,因此未从程序集中导出的私有成员或类型可以使用他们选择的任何名称。”
我得出结论:使用字符#@是安全的!在我的类型名称中,只要它们保留在二进制域中,并且永远不需要出现在源代码中,也不需要出现在程序集之外。事实上,他们从来没有在COM服务器之外使用过。
关于面向未来的一句话......虽然有一个名为“有效名称”的小节(8.5.1节),但CTS几乎没有关于类型名称组成的说法。他们可能会在未来改变这种状况,但是这个广泛而宽松的规范已经邀请我们所有人去做我们喜欢的事情。如果CTS的设计师想留下改变的空间,那么他们肯定会为此提供一些条款,或者至少不会那么慷慨。
好问题,因为它显示了彻底性。我喜欢这样的问题,因为这意味着至少有一些程序员会提前预测问题。 – 2010-11-12 08:33:22