How They Are Stored
Both the string
and the char[]
are stored on the heap - so storage is the same. Internally I would assume a string
simply is a cover for char[]
with lots of extra code to make it useful for you.
Also if you have lots of repeating strings, you can make use of Interning to reduce the memory footprint of those strings.
The Better Option
I would favour string - it is immediately more apparent what the data type is and how you intend to use it. People are also more accustomed to using strings so maintainability won't suffer. You will also benefit greatly from all the boilerplate code that has been done for you. Microsoft have also put a lot of effort in to make sure the string
type is not a performance hog.
The Allocation Size
I have no idea how much is allocated, I believe strings are quite efficient in that they only allocate enough to store the Unicode characters - as they are immutable it is safe to do this. Arrays also cannot be resized without allocating the space in a new array, so I'd again assume they grab only what they need.
Overhead of a .NET array?
Alternatives
Based on your information that there are only 20 language codes and performance is key, you could declare your own enum in order to reduce the size required to represent the codes:
enum LanguageCode : byte
{
en = 0,
}
This will only take 1 byte as opposed to 4+ for two char
(in an array), but it does limit the range of available LanguageCode
values to the range of byte
- which is more than big enough for 20 items.
You can see the size of value types using the sizeof()
operator: sizeof(LanguageCode)
. Enums are nothing but the underlying type under the hood, they default to int
, but as you can see in my code sample you can change that by "inheriting" a new type.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…