首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Boxing..do,我明白了吗?

Boxing..do,我明白了吗?
EN

Stack Overflow用户
提问于 2011-01-19 07:51:21
回答 3查看 219关注 0票数 2

可能重复:

What is boxing and unboxing and what are the trade offs?

嗨,根据我的理解:当我将值类型的数据分配给(引用)类型对象变量时,它会被装箱,结果不是实际引用,因为它指向堆中存储的值的副本。是那么回事吗?谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-01-19 07:53:24

嗯,不完全是。(我一开始看错了你的帖子。)

结果是一个真正的引用,但它并不引用原始变量。它引用堆中的一个对象,该对象包含在装箱发生时保存的变量值的副本。特别是,更改变量的值并不会改变方框中的值:

代码语言:javascript
复制
int i = 10;
object o = i;
i = 11;
Console.WriteLine(o); // Prints 10, not 11

C#不允许您直接访问框内的值--您只能通过取消装箱和获取副本来获得它。另一方面,C++/CLI允许单独访问框内的值,甚至更改。(您仍然可以使用C#更改框中的值-例如,如果值类型实现了某些接口,而接口方法对值进行了变异。)

通常,导致装箱的引用类型是"object“,但它可能是值类型实现的一些接口,或者仅仅是System.ValueType

票数 6
EN

Stack Overflow用户

发布于 2011-01-19 07:54:20

这可能对你有帮助

代码语言:javascript
复制
int i = 1;
object o = i;   // boxing on the heap
int j = (int) o;    // unboxing to the stack
票数 1
EN

Stack Overflow用户

发布于 2011-01-19 07:57:57

是的,对于第一部分,将值类型分配给引用变量将使用装箱。基本上,在任何需要引用类型的上下文中使用值类型都会将值框化。

是的,(在当前实现中)装箱操作将将值类型复制到堆中,并返回对该位置的引用,即使该值已经在堆上(例如,对象的值类型属性),所以您不会获得对原始值变量的引用,但这是实现细节,因为值类型应该被视为不可变。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4732925

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档