C#管理结构中的字符串

h.n*_*ehi 26 c# string struct

我知道字符串具有可变长度,因此它们需要存储器中的可变空间.当我们在a中定义一个字符串项时struct,其struct大小的长度将是可变的.

较旧的语言通过使用固定长度的字符串来管理它.但是,没有办法在C#中定义固定长度的字符串,而C#管理structs中的普通字符串非常好.

当我们定义这样的structs数组或简单的字符串数组时,这变得更加奇怪.由于一个字符串长度的任何变化(减少/增加),所有正向structs必须被移位.

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

jjl*_*lin 48

对字符串的引用(不是值类型)存储在结构中,因此结构大小永远不会更改.

  • 我不是C#语言律师,但AFAIK,C#参考本身没有类型.你是正确的,引用的行为类似于一个值类型(例如,你不能像在C中将指针传递给指针一样传递对引用的引用),但在我的回答中,"这不是一个值type"旨在修改"string"而不是"引用[to string]".我可以理解人们如何将其视为后者,但我认为大多数人会将其视为前者.无论如何,现在评论中有一个很长的澄清. (7认同)
  • 不,字符串不是 [值类型](https://msdn.microsoft.com/en-us/library/s1ax56ch.aspx)。 (5认同)
  • @jjlin据我所知,并非所有字符串都被实习:默认情况下文字字符串都是实习的,调用 `String.Intern()` 的字符串都是实习的,但我认为所有其他都是可以被垃圾收集的常规托管对象。另外,在 .NET 中,可以肯定地说,无论如何,字符串都驻留在堆中,因此在结构中,您将拥有对该堆位置的引用;-) (2认同)

Fir*_*oso 11

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

.NET框架不直接使用C样式字符串(char数组),而是通过不可变引用表示字符串.当附加或修改字符串时,实际上是在内存中创建一个新的字符串对象.这是平台的期望特征,但是需要考虑到期望神奇地调整字符串大小的特征可能导致一些不期望的副作用.

回到你的问题."C#如何管理结构中的字符串?"

从我看到的解释这个问题的两种方法之一:

1).如何创建包含字符串的结构,以及.NET Framework如何在此方案中管理字符串?

简短回答:请记住字符串是不可变类型.通常创建你的结构,并意识到结构只包含对字符串的引用,而不是结构的神奇调整大小段,扩展为包含易失性字符串.

2).如果.NET Framework是由结构体表示的值类型,.NET Framework如何调整其大小.

简短的回答,它没有.这不是.NET如何使用字符串,见上文.


pho*_*oog 7

+1到jjlin以获得对问题的简明而准确的答案,但更一般的答案可能有用:

任何引用类型的字段或变量声明表示引用的存储位置. 对于结构的字段也是如此.

(在结构中包含引用类型字段使该类型成为"托管类型",这在不安全的代码中很重要;您不能声明指向托管类型的指针.)