Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#:哪个会占用更多内存开销?包含一个单词序列的字符串或字符?_C#_.net - Fatal编程技术网

C#:哪个会占用更多内存开销?包含一个单词序列的字符串或字符?

C#:哪个会占用更多内存开销?包含一个单词序列的字符串或字符?,c#,.net,C#,.net,C#:哪个会占用更多内存开销?包含一个单词序列的字符串或字符 我知道一个字符基本上是每个字符组成一个单词的数组(如果不止一个字符),但这最终会导致更多的内存开销,比如当使用字符串而不是字符来保存一个单词长度的内容时?这取决于您使用该内容的次数。Net处理字符串的方式是,如果有多个具有相同值的字符串,则该值只存储在内存中一次,并且每个字符串变量都指向该值。但是,即使字符数组的内容相同,使用的每个字符数组都有自己的内存分配 乙二醇 一般来说,字符串会更有效,因为RobV指出多个具有相同值的字符串都引

C#:哪个会占用更多内存开销?包含一个单词序列的字符串或字符


我知道一个字符基本上是每个字符组成一个单词的数组(如果不止一个字符),但这最终会导致更多的内存开销,比如当使用字符串而不是字符来保存一个单词长度的内容时?

这取决于您使用该内容的次数。Net处理字符串的方式是,如果有多个具有相同值的字符串,则该值只存储在内存中一次,并且每个字符串变量都指向该值。但是,即使字符数组的内容相同,使用的每个字符数组都有自己的内存分配

乙二醇


一般来说,字符串会更有效,因为RobV指出多个具有相同值的字符串都引用了内存中的相同字符串,这就是所谓的字符串。在比较字符串时,这会有很大的好处


如果内存是一个大问题,那么您可能需要小心处理字符串,连接可能会变得非常昂贵。

如果您比较
字符串的内存存储和
字符[]
的内存存储,它们非常相似。它们都是在堆上分配的(编译时创建的文本字符串除外)。它们都包含一些变量(长度等),以及一个包含字符数组的内存区域

但是,根据
字符串的创建方式,它的内存区域可能大于其长度要求,即在内存区域的末尾有一些未使用的字节。
char[]
的内存区域始终与数据所需的大小完全相同

例如,如果您使用StringBuilder创建字符串,并且容量大于其长度(但不超过两倍),则它将返回一个
字符串
对象,该对象的末尾包含未使用的字节

例如:

// set capacity to 8
StringBuilder s = new StringBuilder(8);
// put four characters in it
s.Append("Ouch");
// get the string
string result = s.ToString();

result
变量现在指向一个字符串对象,该对象的字符数据存储区为16字节长,但只使用前10个字符(四个字符,加上结尾的一个
\x0
字符)。

这听起来像是一个家庭作业问题,但万一不是。。。如果您必须在string或char[]之间进行选择以节省内存,那么您可能不应该使用C#进行编程。我之所以这样说,是因为所使用的内存量或多或少是一次清洗,因为存储在字符串中的字符与存储在字符中的字符大小相同。这有什么关系?除非你有一百万个单词,否则这真的不重要…嗯。如果我更改s1=“word2”会怎么样?它会为它分配不同的内存空间吗?s2和s3仍将共享相同的空间,对吗?关于“相同字符串”(也称为“interning”)的注释仅适用于源代码中的字符串(除非您有意请求)。因此,它将只使用一个字符串实例来表示源代码中的“word”,并使用一个字符串实例来表示源代码中的“word2”。但是:如果您不是从源代码(连接或用户输入等)生成字符串“word2”,那么它将有一个不同的实例-即使您执行了200次(有200个实例)。默认情况下,只有文本字符串被插入。
// set capacity to 8
StringBuilder s = new StringBuilder(8);
// put four characters in it
s.Append("Ouch");
// get the string
string result = s.ToString();