Hay situaciones específicas en las que el estrechamiento del tipo subyacente trae algunas ventajas, por ejemplo, el rendimiento relacionado o forzar a un particular, diseño de memoria cuando se hace interfaz con código no administrado.
Considere este ejemplo:
using System;
public enum Operations_PerHourType // : byte
{
Holes = 1,
Pieces = 2,
Sheets = 3,
Strips = 4,
Studs = 5
}
class Program
{
static void Main()
{
long before = GC.GetTotalMemory(false);
var enums = new Operations_PerHourType[10000];
long after = GC.GetTotalMemory(false);
Console.WriteLine(after - before);
// output (byte): 12218 (I'm using Mono 2.8)
// output (Int32): 40960
}
}
Este código consume aproximadamente 40 KB de la pila. Ahora especifique (descomente) el tipo subyacente como byte
y vuelva a compilar. Guau. De repente, solo necesitamos aproximadamente 10 KB.
La compactación de memoria de este tipo a veces puede hacer que un programa sea más lento, no más rápido, dependiendo de los patrones de acceso y tamaños de datos particulares. No hay forma de saber con certeza que hacer algunas mediciones e intentar generalizar a otras posibles circunstancias. El recorrido secuencial de datos más pequeños suele ser más rápido.
Sin embargo, desarrollar el hábito de especificar tipos angostos simplemente porque generalmente es posible y, a veces, crucial, no es una buena idea. El ahorro de memoria rara vez se materializa debido a la alineación de la memoria de los tipos de datos más amplios circundantes. El rendimiento es el mismo o ligeramente peor debido a las instrucciones adicionales necesarias para enmascarar los bytes de relleno.
Como otra respuesta ya lo ha puesto bien, siga la multitud Int32
para la que está optimizado el tiempo de ejecución, hasta que tenga que comenzar a perfilar y direccionar cerdos reales de memoria en su aplicación.
¿Por qué le importa si el almacenamiento es un byte o un int? ¿Cuál es tu motivación para tratar de forzar el uso de un byte? –
No lo hice, hasta que ejecuté la herramienta de análisis de código de Microsoft. Se recomienda usar un Int32. Tengo curiosidad por qué. Usé byte inicialmente porque supuse que sería mejor para el rendimiento. Menos espacio. – Kevin
http://stackoverflow.com/questions/5005319/why-cant-i-declare-an-enum-inheriting-from-byte-but-i-can-from-byte –