我看过 C#struct FooStruct
in ILDASM http://msdn.microsoft.com/en-us/library/f7dy01k1.aspx,并看到以下内容:
ILDASM 此处显示两个不同的声明:
- 一个开始于
.class
value
public
(后窗和前窗的标题栏)
- 一个从刚刚开始
.class public
(前窗)
我想知道哪种语法(如果不是两种)是声明值类型的正确语法?是个value
修饰符是严格必需的,还是可选的,还是语法错误?
简短回答:值类型定义只需要extends [mscorlib]System.ValueType
; the value
属性似乎是可选的并且没有明显的效果。
我假设 CLI 规范 (ECMA-335 http://www.ecma-international.org/publications/standards/Ecma-335.htm)将是寻找权威答案的最佳地点。
值类型定义必须包含value
属性?
II.10 节涉及定义类型。更具体地说,第 II.10.1.3 小节规定:
类型语义属性指定是否应定义接口、类或值类型。 ……如果[interface
] 属性不存在且定义扩展
(直接或间接)System.ValueType
,并且定义不适用于System.Enum
,应定义一个值类型(§II.13)。否则,应定义一个类(§II.11)。
The value
整个部分根本没有提到属性。
结论:正确的值类型定义不必包括value
。源自System.ValueType
足够了。
值类型定义可以包括value
修改器?
CLI 标准还包含 ILASM 语法(在第 VI.C.3 节中)。根据该语法,存在一个value
属性为.class
类型定义。我还搜索了具体值类型定义的标准,并找到了以下示例:
.class public sequential ansi serializable sealed beforefieldinit System.Double extends System.ValueType …
.class private sealed Rational extends [mscorlib]System.ValueType …
-
.class
value
sealed public MyClass extends [mscorlib]System.ValueType …
结论: A value
属性可以包含在值类型定义中。
以及什么是value
属性 平均值?
我尝试将这三个 IL 类型定义编译成程序集:
.class public sealed … A extends [mscorlib]System.ValueType { … }
.class value public sealed … B extends [mscorlib]System.ValueType { … }
.class value public sealed … C extends [mscorlib]System.Object { … } // !!!
没有编译错误,尽管value
属性用于引用类型声明(参见最后一行)。使用 Visual Studio 2012 的对象浏览器查看生成的程序集会发现两种值类型(struct
) A
and B
,和一种引用类型(class
) C
.
推测:的存在value
属性对类型定义没有任何影响。它只是作为人类发现值类型定义的潜在帮助。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)