cómo se almacenan
Tanto el string
y la char[]
se almacenan en el montón - lo que el almacenamiento es el mismo. Internamente yo asumiría un string
simplemente es una cubierta para char[]
con mucha de código extra para que sea útil para usted.
Además, si tiene muchas cadenas repetitivas, puede utilizar Interning para reducir la huella de memoria de esas cadenas.
La mejor opción
yo estaría a favor de cadena - es inmediatamente más evidente lo que el tipo de datos es y cómo va a utilizarlo. La gente también está más acostumbrada a usar cuerdas para que el mantenimiento no sufra. También se beneficiará enormemente de todo el código repetitivo que se ha hecho por usted. Microsoft también se ha esforzado mucho para asegurarse de que el tipo string
no sea un cerdo de rendimiento.
La asignación Tamaño
no tengo ni idea de cuánto se asigna, creo que las cadenas son muy eficientes en cuanto a que sólo se asignan suficiente para almacenar los caracteres Unicode - ya que son inmutables que es seguro hacerlo . Las matrices tampoco se pueden cambiar de tamaño sin asignar el espacio en una nueva matriz, así que supongo que solo toman lo que necesitan.
Overhead of a .NET array?
Alternativas
Con base en la información de que sólo hay 20 códigos de lenguaje y el rendimiento es clave, se puede declarar su propia enumeración con el fin de reducir el tamaño requerido para representar los códigos:
enum LanguageCode : byte
{
en = 0,
}
Esto sólo se llevará a 1 byte en oposición a 4+ para dos char
(en una matriz), pero no limitar la gama de availabl e LanguageCode
valores en el rango de byte
- que es más que suficiente para 20 elementos.
Puede ver el tamaño de los tipos de valores utilizando el operador sizeof()
: sizeof(LanguageCode)
. Los enumerados no son más que el tipo subyacente bajo el capó, por defecto son int
, pero como puede ver en mi ejemplo de código, puede cambiar eso "heredando" un nuevo tipo.
¿Ha hecho demostrado a sí mismo que este es un problema todavía? Raramente encontré la necesidad de preocuparme por la memoria cuando uso cuerdas, especialmente las más pequeñas. Si no se muestra como un problema, no te preocupes hasta que lo esté. Es una solución fácil en una fecha posterior si las cadenas están causando un problema de memoria. De lo contrario, use una cadena y ni siquiera piense en problemas de memoria. –
Tengo una lógica muy intensa que almacena miles de estos en la memoria por lo que cada poco ayuda. –
@William Si el rendimiento es tan crítico, ¿por qué no declarar un 'enum LanguageCode: short' y guardar 2 bytes? –