C# 中字符串会被装箱吗?

问题描述 投票:0回答:3

2024 年 1 月 5 日更新:此链接的答案似乎表明 C# 编译器在尝试将字符串转换为对象时完全删除了对象转换:https://stackoverflow.com/a/51381643/3163495

所以,答案肯定是否定的,字符串不会被装箱。


原问题:

我知道 C# 中的

int
bool
等值类型会被装箱,如本例所示:

int i = 5;
object o = i; // boxing occurs

但是我还需要担心 C# 装箱

string
类型吗?

string e = "hello world";
object o = e; // does boxing occur here?

我问是因为

string
类型是具有值语义的引用类型,所以我不确定。

c# string value-type boxing reference-type
3个回答
5
投票

String 是引用类型(字符串和字符串文字 doc,内置引用类型:string doc),装箱仅适用于值类型 - docs:

装箱是将值类型转换为类型

object
或转换为该值类型实现的任何接口类型的过程。

所以不,当它们被转换为

object
时,它们不会被装箱,这就是所谓的隐式引用转换

换句话说,虽然引用转换可以更改引用的类型,但它永远不会更改所引用对象的类型或值。

所以基本上

string
没有装箱(或者在创建它们后总是装箱 - 正如评论中 @Charlieface 正确提到的那样)。


1
投票

这根本不是拳击。字符串是引用类型,只有值类型可以装箱。字符串已经存在于堆中。

Object o = e
是向上转型,因为对象是所有类型的根


-1
投票

尽管某些来源存在“精神上的懒惰”,但字符串没有值语义。不变性和值相等不是值语义的主要特征。

局部值在堆栈上分配,而不是在堆上。值的所有实例都具有相同的大小。分配时,将复制实际值。字符串不做这些事情。

因此,说它们具有价值语义是在很大程度上“捏造”定义,导致您的问题呈现出各种不确定性。

© www.soinside.com 2019 - 2024. All rights reserved.