c# - String 和 Char 类型如何存储在 .NET 的内存中?

标签 c# memory memory-management garbage-collection clr

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

将类型定义为“String”还是“Char”更好?

private string languageCode;

private char[] languageCode;

或者还有其他更好的选择吗?

这 2 个如何存储在内存中?分配值时将分配多少字节或位?

最佳答案

它们的存储方式

stringchar[] 都存储在堆上 - 所以存储是相同的。在内部,我会假设 string 只是 char[] 的封面,带有 lots 的额外代码以使其对您有用。

如果你有很多重复的字符串,你可以使用Interning以减少这些字符串的内存占用。

更好的选择

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

分配大小

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

Overhead of a .NET array?

替代品

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

enum LanguageCode : byte
{
    en = 0,
}

这将只占用 1 个字节,而不是 4+ 两个 char(在一个数组中),但它确实将可用 LanguageCode 值的范围限制在该范围内byte - 足以容纳 20 个项目。

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

关于c# - String 和 Char 类型如何存储在 .NET 的内存中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10782690/

相关文章:

c# - 等待 ExecuteAsync() 结果

c# - 如果两个 T 具有相同的约束条件,如何将它们视为相等?

c#更改变量内存地址

c - 如何在 C 编程语言中手动分配指针地址?

java - 下载文件而不知道其大小

我可以指定堆的位置来序列化我的数据吗?

iphone - 了解iPhone上的内存消耗

c# - Textbox.Text 在不触发 Textchanged 事件的情况下自行更改(不是绑定(bind)问题)

c# - 如何在 wpf 中引发附加事件?

c++ - std::aligned_storage 如何为任何对象公开正确对齐的存储?