首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >int和string中的装箱和取消装箱

int和string中的装箱和取消装箱
EN

Stack Overflow用户
提问于 2011-06-21 09:56:46
回答 4查看 15.1K关注 0票数 9

我在拳击和不拳击方面有点困惑。根据它的定义

装箱是将ValueTypes隐式转换为引用类型(对象)。

UnBoxing是将引用类型(对象)显式转换为其等效的ValueTypes。

描述这一点的最好例子是

代码语言:javascript
复制
int i = 123; object o = i;  // boxing

代码语言:javascript
复制
o = 123; i = (int)o;  // unboxing 

但我的问题是int是值类型还是字符串是引用类型

代码语言:javascript
复制
int i = 123; string s = i.ToString();

代码语言:javascript
复制
s = "123"; i = (int)s; 

这是拳击和取消拳击的例子吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-06-21 10:00:31

调用ToString不是装箱。它创建一个刚好包含int文本表示的新字符串。

调用(object)1时,这将在堆上创建一个包含int的新实例。但它仍然是一个int。(您可以使用o.GetType()验证这一点)

字符串不能通过强制转换转换为int。所以您的代码不会编译。

如果您首先将您的字符串转换为object,您的代码将在运行时编译,但在运行时失败,因为您的对象没有装箱int。只能将值类型解压缩为完全正确的类型(或关联的可空)。

两个例子:

破碎:

代码语言:javascript
复制
object o=i.ToString();// o is a string
int i2=(int)o;//Exception, since o is no int

工作:

代码语言:javascript
复制
object o=i;// o is a boxed int
int i2=(int)o;//works 
票数 21
EN

Stack Overflow用户

发布于 2011-06-21 10:18:39

代码语言:javascript
复制
 int i = 2;
 string s = i.ToString();

这是而不是装箱。这只是对Int32.ToString()的方法调用,它返回表示int值的格式化字符串。

代码语言:javascript
复制
 i = (int)s;

这段代码不会编译,因为System.StringSystem.Int32之间没有明确的转换。

想一想,用以下的方式来理解什么是拳击和什么不是拳击和取消拳击

  1. Bo行:当您接受一个值类型并将它“粘贴”到一个引用变量中时。此操作不需要任何特定类型的转换逻辑才能工作。如果您使用GetType().
  2. Unboxing:,则变量类型仍然是相同的--它的操作正好相反。将值类型固定在引用对象中,并将其赋值给值类型变量。同样,此操作不需要任何特定类型的转换逻辑来工作。

因此,如果System.Int32.是有效的,那么它只是一个显式转换,而不是取消装箱操作,因为s.GetType()将返回System.String,而不是s.GetType()

票数 2
EN

Stack Overflow用户

发布于 2011-06-21 10:54:29

装箱/取消装箱:将值类型转换为其对象表示,反之亦然(例如int和object)。

相反,ToString()方法是一个生成新字符串的操作,与装箱/强制/类型会话无关。

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

https://stackoverflow.com/questions/6423452

复制
相关文章

相似问题

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