2012-06-21 8 views
7

En la estructura DateTime de .Net framework, Year se define como int (que en realidad es A System.Int32). Sin embargo, la documentación de MSDN dice que el valor siempre será between 1 and 9999. Por lo tanto, un ushort (System.UInt16) es más que adecuado para almacenar el valor y ocupa la mitad del espacio. Entonces, ¿por qué es un int y no un ushort?¿Por qué DateTime.Now.Year es int y no ushort

Hay una conversión implícita de ushort a int, por lo que no es necesario realizar una conversión para hacer una aritmética de enteros en el año.

Me doy cuenta de que esto es un problema de micro-optimización y por lo tanto no es muy importante. Tengo curiosidad.

+2

Es * no * es una optimización. Abajo de http://stackoverflow.com/questions/10065287/why-is-ushort-system-uint16-ushort-equal-to-int-system-int32/10157517#10157517 –

+0

Incluso con un 'ushort', tendríamos estar desperdiciando los dos mejores bits ... – AakashM

Respuesta

4

Por lo tanto, un ushort (System.UInt16) es más que adecuado para almacenar el valor y ocupa la mitad del espacio.

¿Dónde crees que se está desperdiciando "espacio"? DateTime no almacena cada componente en un campo separado de todos modos. Si estás almacenar el año en algún lugar, no dude en echarlo a un ushort - y echó a un Monthbyte, etc.

Tenga en cuenta que ushort no es compatible con CLS, que es probablemente la razón para ello . Hay un lote de propiedades que tendría sentido que no estén firmadas, como string.Length, etc. pero el marco intenta cumplir con CLS donde puede.

unidad
0
  • devuelve un entero sin signo de 16 bits
  • Int devuelve un entero de 32 bits.

Supongo que el compilador JIT aprovecha la arquitectura de la CPU y, por lo tanto, el procesamiento a 32 bits sería más eficiente que 16 bits. Creo que hubo un debate similar con VB6 cuando se usa Integers vs Longs (Bytes asignados vs Architecture Speed).

http://blogs.msdn.com/b/davidnotario/archive/2005/08/15/451845.aspx

Cuestiones relacionadas