在查看 Int32 的源代码并研究为什么我的 DataContractSerializer 不会序列化我的结构但使用 int 时它工作正常时,我遇到了一些奇怪的代码
public struct Int32 : ...
{
internal int m_value;
public const int MaxValue = 0x7fffffff;
如果 Int32 和 int 是别名,为什么在 Int32 中声明 int?
在查看 Int32 的源代码并研究为什么我的 DataContractSerializer 不会序列化我的结构但使用 int 时它工作正常时,我遇到了一些奇怪的代码
public struct Int32 : ...
{
internal int m_value;
public const int MaxValue = 0x7fffffff;
如果 Int32 和 int 是别名,为什么在 Int32 中声明 int?
int
vs.Int32
与这个问题无关。该字段显示为int
只是因为您用来查看它的工具在显示它们时用它们的别名替换了这些类型。如果您使用较低级别的工具查看 is ,您会发现它不知道int
,只知道Int32
。
问题是该Int32
结构包含一个Int32
字段。
“站在什么
int
立场上?” “你很聪明,年轻人,很聪明,”老太太说。“但它int
一直在下降!”
这个问题的解决方法很神奇。运行时知道 anInt32
是什么并对其进行特殊处理以避免无限递归。您不能编写包含自身作为字段的自定义结构。Int32
是内置类型,没有普通结构。为了一致性起见,它只是显示为结构。
这个问题并不像看起来那么愚蠢,因为通常它会导致循环结构布局在struct
其中具有与整个结构相同类型的实例字段。例如,这将不起作用,显然:
struct MyStruct
{
internal MyStruct m_value;
}
给出:
错误 CS0523:“SomeNamespace.MyStruct”类型的结构成员“SomeNamespace.MyStruct.m_value”导致结构布局中出现循环
编译时错误。所以一定有什么魔力Int32
。
好吧,它与 alias 几乎相同,这将把 int 放在使用 int32 的任何地方,因为 MaxValue 是常量,它不会用该值创建。
所以基本上创建 int32 将创建一个只有 int 的元素结构。但是由于使用结构 MaxValue 可以随时获得。