|
1
3
如前所述,32位整数可以有两种类型。内存或CPU寄存器(不仅仅是堆栈)中的任意四个字节,即fast版本。它可以嵌入到System.Object中,即盒装版本。System.Int32的声明与后者兼容。装箱时,它有一个典型的对象头,后跟存储值的4个字节。这4个字节正好映射到mèu值成员。也许你明白为什么这里没有冲突了:mïu值是 总是 语言编译器和JIT编译器都非常清楚Int32的属性。编译器负责决定何时需要对整数进行装箱和解装箱,它会生成相应的IL指令。它知道有哪些IL指令可用于操作整数,而无需先对其装箱。从System.Int32实现的方法中显而易见,例如,它没有运算符==()的重写。这是由CEQ操作码完成的。但是它确实有一个Equals()的重写,在整型被装箱时重写Object.Equals()方法是必需的。你的编译器需要有同样的意识。 |
|
|
3
0
魔术其实是在拳击/拆箱。
您的代码示例所做的是创建
参考
|
|
|
4
0
理论基础其他答案是无知和/或误导。
首先阅读我的答案可以帮助理解这一点 How do ValueTypes derive from Object (ReferenceType) and still be ValueTypes?
怎么回事?
这意味着,如果您有一个采用32位整数的方法,则不能使用常规的
在C#中,这意味着
所以当一个结构像
确实会编译为(因此是无效的):
而是编译到(忽略接口):
不
需要一个特殊的案例来编译
像ILSpy、dnSpy、.NET Reflector等反编译器可能会产生误导。他们(在撰写本文时)将反编译
如果用纯IL编写程序,则完全可以创建自己的值类型,其中包含
但在功能上,没有区别,在CLR的幕后也没有魔法。 |
|
|
Nicola · C++CLI项目中非托管数据上的C#指针 8 年前 |
|
|
Anton Savelyev · 在发布版本中删除类指针会导致内存问题 8 年前 |
|
|
shmnff · 显式转换int到SqlInt32 8 年前 |
|
|
Alex12 · windows窗体中的C++if语句[关闭] 8 年前 |
|
|
Claude Tan · 类型定义和类型引用之间有什么区别? 8 年前 |