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