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
类型是具有值语义的引用类型,所以我不确定。
String 是引用类型(字符串和字符串文字 doc,内置引用类型:string doc),装箱仅适用于值类型 - docs:
装箱是将值类型转换为类型
或转换为该值类型实现的任何接口类型的过程。object
所以不,当它们被转换为
object
时,它们不会被装箱,这就是所谓的隐式引用转换:
换句话说,虽然引用转换可以更改引用的类型,但它永远不会更改所引用对象的类型或值。
所以基本上
string
没有装箱(或者在创建它们后总是装箱 - 正如评论中 @Charlieface 正确提到的那样)。
这根本不是拳击。字符串是引用类型,只有值类型可以装箱。字符串已经存在于堆中。
Object o = e
是向上转型,因为对象是所有类型的根
尽管某些来源存在“精神上的懒惰”,但字符串没有值语义。不变性和值相等不是值语义的主要特征。
局部值在堆栈上分配,而不是在堆上。值的所有实例都具有相同的大小。分配时,将复制实际值。字符串不做这些事情。
因此,说它们具有价值语义是在很大程度上“捏造”定义,导致您的问题呈现出各种不确定性。