【问题标题】:Why System.Int32 is struct and System.String is class [duplicate]为什么 System.Int32 是 struct 而 System.String 是类 [重复]
【发布时间】:2014-01-09 13:29:53
【问题描述】:

从我开始 c# 编程的那一刻起,这确实是我心中的一个问题。

为什么intstruct 类型

stringclass 类型

【问题讨论】:

  • 首先,请阅读structclass之间的区别。其次,因为int32-bit,非常适合struct。但是你不知道string能有多少..

标签: c# class struct


【解决方案1】:

因为int 的长度是固定的,而string 的长度是可变的。因此,编译器可以为ints 保留一个固定区域(主要在堆栈上),并且必须在堆上为strings char 数组维护一个灵活的缓冲区。

【讨论】:

  • 如果 String 可以作为值类型,例如包含Char[] 类型的字段。这样的设计的优点是允许default(String) 表现为一个空字符串[就像前面的 COM 框架中的情况一样],而不是一个空值,但缺点是在转换字符串时需要装箱到Object
【解决方案2】:

int 是值类型,string 是引用类型。当您将值类型传递给方法或将它们分配给新变量等时,值类型按值传递(复制)。引用类型只复制了引用。

对于整数或浮点数等小对象,复制速度很快,但在某些时候,复制操作的成本会变得昂贵,因此引用比一直复制值更可取。

虽然字符串也是不可变的,但与大多数值类型一样(是否有任何可变值类型?)因为字符串可能非常大,它们不适合按值传递。

【讨论】:

  • 不完全正确。由于其固有的关于长度的动态特性,编译器无法为字符串分配固定大小的内存块。
  • 是的,可以有可变的值类型(你可以定义你自己的结构),但是不,这不是一个好主意。
  • @ThomasWeller: @ThomasWeller: String 可以定义为具有单个私有字段的结构,其中包含对某些可变大小对象的对象的引用,例如Char[] 永远不会被修改。这样的设计将使default(String) 可以表现为空字符串而不是空值,这可能简化了为 COM 编写的代码的移植,它将全位零指针视为一个空字符串。然而,将这样的字符串转换为Object 需要装箱或特殊的框架“魔术”来避免装箱。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-19
  • 2014-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-04
相关资源
最近更新 更多