2012-02-17 71 views
22

我知道字符串具有可变长度,因此它们需要存储器中的变量空间来存储。当我们在struct中定义一个字符串项目时,struct的大小就会变长。结构中字符串的C#管理

以前的语言通过使用固定长度的字符串来管理它。但是,在C#中没有办法定义固定长度的字符串,并且C#管理的标准字符串很不错。

当我们定义这样的struct的数组或者只是一串字符串时,这会变得更加奇怪。由于一个字符串的长度发生任何变化(减少/增加),所有正向struct必须移位。

C#如何在结构中处理可变长度的字符串?

+2

C#不是C--你假设内存在两者中都以相同的方式管理。 – Oded 2012-02-17 19:40:46

+0

是啊......我的错。 – 2012-02-18 10:11:28

回答

37

对该字符串(不是值类型)的引用存储在结构中,因此结构大小从不改变。

+1

+1非常简洁! – Candide 2012-02-17 19:40:01

+0

您的意思是“是价值类型”吗? – Krythic 2017-02-18 03:23:45

+0

不,字符串不是[值类型](https://msdn.microsoft.com/en-us/library/s1ax56ch.aspx)。 – jjlin 2017-02-18 05:25:28

5

+1到jjlin一个简洁而准确的回答这个问题,但更普遍的答案可能是有用的:

场或任何变量声明参考类型代表存储位置供参考。对于结构体的字段也是如此。

(包括一个结构的引用类型的字段,使该类型是“管理型”,这是不安全的代码很重要,你不能一个指针声明为管理型)。

9

我的第一个问题你会这样做,你的需求是否需要固定长度的字符串?如果是这样的话,char []实际上可能就是你打算使用的。

.NET框架不直接使用C风格的字符串(char数组),而是通过不可变引用表示字符串。当字符串被追加或修改时,实际上是在内存中创建一个新的字符串对象。这是该平台的一个理想功能,但需要考虑的因为期望神奇地调整字符串大小可能会导致一些不受欢迎的副作用。

回到你的问题。 “C#如何在结构中管理字符串?”

一两种方式,从我所看到的解释了这个问题:

1)。我如何创建包含字符串的结构体,以及.NET Framework如何在这种情况下管理字符串?

简短回答:请记住,字符串是不可变的类型。通常创建你的结构体,并且认识到结构体只包含对字符串的引用,而不是一个神奇地调整大小的结构体部分,它扩展为包含你的易失性字符串。 2)。 .NET Framework如何调整字符串的大小,如果它们是由结构体表示的值类型。

简而言之,它没有。这不是如何。NET使用字符串,参见上文。

+1

谢谢Firoso。不,我对字符串感到满意。我只关心对结构体和字符串数组的操作的时间复杂性。现在我知道了这个技巧:“引用字符串”。 – 2012-02-17 20:07:16

+0

如果您担心强操纵和突变的效率,请考虑使用StringBuilder类。 – Firoso 2012-02-17 20:15:38

-5

结构保存堆栈和字符串存储在堆上。

与基本类型保存堆栈和引用类型保存在堆上相同。