int和string中的装箱和拆箱

Gau*_*wal 8 .net c# boxing types

我在拳击和拆箱方面有点困惑.根据其定义

Boxing是ValueTypes到引用类型(Object)的隐式转换.
UnBoxing是将引用类型(Object)显式转换为其等效的ValueTypes.

描述这个的最好例子是

int i = 123; object o = i;  // boxing
Run Code Online (Sandbox Code Playgroud)

o = 123; i = (int)o;  // unboxing 
Run Code Online (Sandbox Code Playgroud)

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

int i = 123; string s = i.ToString();
Run Code Online (Sandbox Code Playgroud)

s = "123"; i = (int)s; 
Run Code Online (Sandbox Code Playgroud)

这是拳击和拆箱的例子吗?

Cod*_*aos 20

打电话ToString不是拳击.它创建一个恰好包含int的文本表示的新字符串.

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

无法使用强制转换转换为字符串int.所以你的代码不会编译.

如果你第一次将你的字符串强制转换为object你的代码将会编译但在运行时失败,因为你的对象没有盒装int.您只能将值类型拆分为完全正确的类型(或关联的可为空).

两个例子:

破碎:

object o=i.ToString();// o is a string
int i2=(int)o;//Exception, since o is no int
Run Code Online (Sandbox Code Playgroud)

工作:

object o=i;// o is a boxed int
int i2=(int)o;//works 
Run Code Online (Sandbox Code Playgroud)