我知道字符串具有可变长度,因此它们需要存储在内存中的可变空间。当我们在struct
中定义字符串项时,struct
的大小将随长度变化。
较旧的语言通过使用固定长度的字符串来管理它。但是,没有办法在C#中定义固定长度的字符串,而C#管理struct
中的普通字符串非常好。
当我们定义这样的struct
s数组或简单的字符串数组时,这变得更加奇怪。由于一个字符串长度的任何变化(减少/增加),所有前向struct
必须被移位。
C#如何处理结构中的可变长度字符串?
答案 0 :(得分:44)
对字符串的引用(不是值类型)存储在结构中,因此结构大小永远不会改变。
答案 1 :(得分:11)
我的第一个问题是,你的要求是否需要一个固定长度的字符串?如果是这样,char []可能实际上是您打算使用的。
.NET框架不直接使用C风格的字符串(char数组),而是通过不可变引用表示字符串。当附加或修改字符串时,实际上是在内存中创建一个新的字符串对象。这是该平台的理想功能,但需要考虑的是期望神奇地调整字符串大小可能会导致一些不良的副作用。
回到你的问题。 “C#如何管理结构中的字符串?”
从我看到的内容中解释这个问题的两种方法之一:
1)。如何创建包含字符串的结构,以及.NET Framework如何在此方案中管理字符串?
简短回答:请记住字符串是不可变类型。正常创建你的struct,并意识到struct只包含对字符串的引用,而不是扩展为包含易失性字符串的结构的神奇调整大小段。
2)。如果.NET Framework是由结构体表示的值类型,.NET Framework如何调整其大小。
简短回答,但事实并非如此。这不是.NET如何使用字符串,见上文。
答案 2 :(得分:7)
+1到jjlin以获得对问题的简明而准确的答案,但更一般的答案可能有用:
任何引用类型的字段或变量声明 表示引用的存储位置。对于结构的字段也是如此。
(在结构中包含引用类型字段使该类型成为“托管类型”,这在不安全的代码中很重要;您不能声明指向托管类型的指针。)
答案 3 :(得分:2)
C#管理字符串中的字符串,就像管理字符串一样。参见:
答案 4 :(得分:-5)
堆栈中的结构保存和堆上的字符串存储。
与原始类型相同,保存在堆栈上,引用类型保存在堆上。