C# 为什么System.Int32是结构,System.String是类

C# 为什么System.Int32是结构,System.String是类,c#,class,struct,C#,Class,Struct,从我开始c#编程的那一刻起,我就一直在思考这个问题 为什么int是struct类型 而字符串是类类型 int是一种值类型,string是一种引用类型。当您将值类型传递给方法或将其分配给新变量等时,值类型按值传递(复制)。引用类型仅复制引用 对于int或float之类的小对象,复制速度很快,但在某些情况下,复制操作的成本会很高,因此引用比始终复制值更可取 虽然字符串也是不可变的,就像大多数值类型一样(有任何可变值类型吗?),因为字符串可能很大,所以它们不是通过值传递的好对象。因为int具有固定长

从我开始
c#
编程的那一刻起,我就一直在思考这个问题

为什么
int
struct
类型

字符串
类型


int是一种值类型,string是一种引用类型。当您将值类型传递给方法或将其分配给新变量等时,值类型按值传递(复制)。引用类型仅复制引用

对于int或float之类的小对象,复制速度很快,但在某些情况下,复制操作的成本会很高,因此引用比始终复制值更可取


虽然字符串也是不可变的,就像大多数值类型一样(有任何可变值类型吗?),因为字符串可能很大,所以它们不是通过值传递的好对象。

因为
int
具有固定长度,而
字符串
长度是可变的。因此,编译器可以为
int
s(主要在堆栈上)保留一个固定区域,并且它必须为堆上的
字符串
s字符数组保留一个灵活的缓冲区。

首先,请阅读
struct
class
之间的区别。其次,因为
int
32位的
,非常适合
struct
。但是你不知道字符串能有多少,不完全正确。由于其固有的关于长度的动态特性,编译器无法为字符串分配固定大小的内存块。是的,可以有可变值类型(您可以定义自己的结构),但不是,这不是一个好主意。@ThomasWeller:
String
可以被定义为一个结构,其中一个私有字段包含对某个可变大小对象的引用,例如,
Char[]
,它永远不会被修改。这样的设计使得
default(String)
可以作为空字符串而不是空值,这可能会简化为COM编写的代码的移植,COM将所有位零指针视为空字符串的合法表示形式。然而,将这样一个字符串转换为
对象
,需要装箱或特殊的框架“魔术”来避免装箱。如果
字符串
包含
Char[]
类型的字段,则可以将其设为值类型。这种设计的优点是允许
default(String)
表现为空字符串[在前面的COM框架中就是这样]而不是空值,但缺点是每当字符串转换为
对象时都需要装箱。