字符串是值类型还是引用类型?

Sch*_*rtz 49 .net string types reference

字符串是值类型还是引用类型?

我只是找不到这个"好"的解释......

Mar*_*ell 93

Console.WriteLine(typeof(string).IsClass); // true
Run Code Online (Sandbox Code Playgroud)

这是一种参考类型.

它不能是数值类型,作为值类型需要的已知大小的堆栈等.作为参考类型,大小参考事先是已知的,即使所述字符串的大小是没有的.

它的行为就像你期望值类型一样,因为它是不可变的; 即它一旦创建就不会改变.但是还有很多其他不可变的引用类型.例如,委托实例.

*=除了内部StringBuilder,但你在这样做的时候从未看到它...

  • 这件事与它有什么关系?它只是一个别名...对象是引用类型,例如. (9认同)
  • +1.我真的不喜欢小写字符串"type".看起来像值类型,行为类似于引用类型. (5认同)
  • StringBuilder在内部使用char [],而不是字符串. (5认同)
  • @Phong再次检查.上次我看,它老实说是一个`字符串` - 它然后做不安全的变异(分配一个新的字符串并在需要时复制).你检查过吗?如果是这样的话:.net版本是什么? (2认同)
  • @SMI是`string`的默认值是'null`,正是因为`string`是一个引用类型.说`string`的默认值是``"`是不正确的,因为:它不是. (2认同)
  • @MihailGeorgescu不,不是; 对不起,但这是不正确的.`m_firstChar`在内部用作占位符,用作指向数据开头的`char*`指针,但它*不包含*a`char []`(或对`char [的引用) `).对象本身*是数据*.它是运行时以可变长度分配的仅有的两种对象类型之一(另一种是数组). (2认同)

kem*_*002 17

String是不可变的引用类型.

请参阅博客文章不可变类型:了解它们的好处并将其用于不变性.


Cha*_*ana 11

基本的"解释"基于"什么"实际存储在您为事物"声明"变量时分配的内存位置.如果事物的实际值存储在变量名称引用的内存位置,则它是值类型.

   int x;  // memory allocated to hold Value of x, default value assigned of zero
Run Code Online (Sandbox Code Playgroud)

如果,otoh,当您"声明"变量时分配的内存插槽将仅保存其中将存储实际值(或多个值)的其他内存地址,则它是引用类型.

   MyClass x;  // Memory allocated to hold an address, 
               // default address of null (0) assigned.  
               // NO MEMORY ALLOCATED for x itself 
Run Code Online (Sandbox Code Playgroud)

或者,如果声明包括初始化,

   MyClass x = new MyClass();  
     // Now, Memory slot (call it Addr1) is allocated to hold address of x, 
     // more memory (call it Addr2) is allocated to hold a new MyClass object.
     // New MyClass object created, stored in memory Addr2 (on the Heap)
     // Address of new object (Addr2) is stored in Addr1
Run Code Online (Sandbox Code Playgroud)

对于一个字符串,该字符串是在Heap上创建的,它的地址位于为该变量分配的内存槽中,因此它是一个引用类型.


Jar*_*Par 5

String是一种不可变的引用类型,它具有某些特性,使其偶尔出现为值类型