string是一个值types还是引用types?

string是一个值types还是引用types?

我无法find这个“好”的解释

 Console.WriteLine(typeof(string).IsClass); // true 

这是一个参考types。

它不能是一个值types,因为值types需要栈的已知大小等。作为引用types,引用的大小是事先已知的,即使string的大小不是。

它的行为就像你期待值types的行为,因为它是不可变的; 即一旦创build就不会改变。 但是还有很多其他不可变的引用types。 例如委托实例。

* =除了内部的StringBuilder ,但你永远不会看到它,而这样做…

string是不可变的引用types。

看到博客文章Immutabletypes:了解他们的好处,并使用他们的不变性。

string是一个引用types 。

基本的“解释”是基于在你为事物“声明”variables时分配的内存位置中实际存储的“什么”。 如果事物的实际值存储在由variables名引用的存储器位置中,则它是值types。

  int x; // memory allocated to hold Value of x, default value assigned of zero 

如果在“声明”variables时分配的内存插槽仅保存实际值(或值)将被存储的其他内存地址,那么它是一个引用types。

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

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

  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 

对于一个string,这个string是在堆上创build的,它的地址是在为variables分配的内存槽中,所以它是一个引用types。

string是一个不可变的引用types,它具有一定的特性,使其偶尔出现一个值types

stringtypes表示一个零个或多个Unicode字符的序列。 string是.NET Framework中的string的别名。

尽pipestring是一个引用types,但是定义了相等运算符(==和!=)来比较string对象的值,而不是引用。 这使得对string相等的testing更直观。 例如:

 string a = "hello"; string b = "h"; // Append to contents of 'b' b += "ello"; Console.WriteLine(a == b); Console.WriteLine((object)a == (object)b); 

这将显示“True”,然后显示“False”,因为string的内容是相同的,但a和b不会引用相同的string实例。

string是不可改变的 – string对象的内容在创build对象之后是不能改变的,尽pipe语法使得它看起来好像你可以做到这一点。 例如,编写这段代码时,编译器实际上会创build一个新的string对象来保存新的字符序列,并将该新的对象分配给b。 string“h”然后有资格进行垃圾收集。

 string b = "h"; b += "ello"; 

在许多语言中,存在两种一般types的东西:定义types的存储位置实际上将持有该types的对象的那些types,以及定义types的存储位置将持有对该types的对象的引用存储在别处。 还有一些可能提供的语义types:

  1. 不可变价值语义:特定types的实例具有一些构成身份基础的特征(“价值”)。 两个值相等的项目可以互换使用,不pipe它们被存储在何处。 只要实例存在,值就会保持不变。 这种types的variables可能会改变其值,但只能通过将不同的实例存储到variables中。
  2. 不可变引用语义:通常类似于不可变值语义,只是在不同时间创build的两个实例将自己报告为不同的实例。
  3. 可变的值语义:特定types的实例具有一些形成身份基础的特征(“值”)的特征或集合,但是这些特征可以在不replace整个实例的情况下被改变。 每个实例只存储在一个variables或字段中; 将一个variables或字段复制到另一个variables或字段将所有值从第一个实例复制到第二个实例,但实例保持独立。 一个实例的未来更改不会影响另一个实例。
  4. 可变的引用语义:每个实例与其自身完全相同,但不包含其他实体,并且实例具有一个或多个在现有实例内可以更改的值。 任何数量的variables或字段都可以保存对任何实例的引用。 复制一个或一个字段variables到另一个只是使第二个引用与第一个相同的实例。 因此,对其中一个variables引用的实例所做的任何更改都会影响另一个variables(即同一个实例)引用的实例。

在像C ++这样的编程语言中,直接存储和间接引用types都可以实现以上四种语义types中的任何一种。 在.net和C#中,带有暴露字段的直接存储types总是实现#3,暴露字段的类types始终实现#4,其他值types可以实现以上任何一种,其他引用types可以实现#1,#2,或#4,但不是#3,只有一点漏洞的抽象。 string执行#1。

也许在.NET和C#中的文章string可以帮助你。 根据这篇文章,string是一个引用types。