String和Char类型如何在.NET中存储在内存中?

The*_*ght 11 c# memory clr garbage-collection memory-management

我需要存储一个语言代码字符串,例如"en",它总是包含2个字符.

将类型定义为"String"或"Char"更好吗?

private string languageCode;
Run Code Online (Sandbox Code Playgroud)

VS

private char[] languageCode;
Run Code Online (Sandbox Code Playgroud)

或者还有另一种更好的选择吗?

这些2如何存储在内存中?分配值时,将为它们分配多少字节或位?

Ada*_*rth 8

它们是如何存储的

无论是stringchar[]存储在堆-所以存储是一样的.在内部我会假设一个string简单的封面,char[]很多额外的代码,使它对你有用.

此外,如果您有许多重复的字符串,您可以使用Interning来减少这些字符串的内存占用.

更好的选择

我倾向于使用字符串 - 数据类型是什么以及打算如何使用它会更加明显.人们也更习惯使用字符串,因此可维护性不会受到影响.您也将从为您完成的所有样板代码中受益匪浅.微软也付出了很多努力来确保这种string类型不是一种性能损失.

分配大小

我不知道分配了多少,我相信字符串是非常有效的,因为它们只分配足够的存储Unicode字符 - 因为它们是不可变的,这样做是安全的.如果没有在新数组中分配空间,也无法调整数组的大小,所以我再次假设它们只抓取他们需要的内容.

.NET数组的开销?

备择方案

根据您的信息,只有20个语言代码和性能是关键,您可以声明自己的枚举,以减少代表代码所需的大小:

enum LanguageCode : byte
{
    en = 0,
}
Run Code Online (Sandbox Code Playgroud)

这只需要1个字节而不是2个4+ char(在一个数组中),但它确实将可用LanguageCode值的范围限制在byte- 对于20个项目而言足够大.

您可以使用sizeof()运算符查看值类型的大小:sizeof(LanguageCode).枚举只是底层的基础类型,它们默认为int,但正如您在我的代码示例中所看到的,您可以通过"继承"新类型来更改它.