2008-11-06 21 views
8

A menudo tengo que convertir un valor recuperado (generalmente como una cadena) - y luego convertirlo a un int. Pero en C# (.Net) tiene que elegir int16, int32 o int64. ¿Cómo sabe cuál elegir cuando no sabe qué tan grande será el número recuperado?Convirtiendo a int16, int32, int64: ¿cómo sabe cuál elegir?

+0

No olvide, si no necesita números negativos, C# también tiene entradas sin firmar (uint32, uint64). – Powerlord

Respuesta

20

Todos los que han mencionado que declarar un Int16 salva Ram deben obtener un voto a favor.

La respuesta a tu pregunta es utilizar la palabra clave "int" (o si te apetece, usa "Int32").

que le da una autonomía de hasta 2,4 mil millones de números ... Además, los procesadores de 32 bits se encargará de esos enteros mejores ... también (y la razón más importante) es que si se va a utilizar para que int casi cualquier razón ... es probable que necesite ser un "int" (Int32).

En el framework .Net, el 99.999% de los campos numéricos (que son números enteros) son "ints" (Int32).

Ejemplo: Array.Length, Process.ID, Windows.Width, Button.Height, etc., etc., 1 millón de veces.

EDIT: Me doy cuenta de que mi malhumor me va a bajar la votación ... pero esta es la respuesta correcta.

+3

¿Por qué rechazaron las respuestas que indican que un Int16 ocupa menos RAM que un Int32? Generalmente lo hace y esto puede ser un factor importante si necesita almacenar una gran cantidad de enteros en la memoria. PS. Realmente disfruté tu malhumor y no te perdoné por ello. :) –

+1

Lo más irritante: Stream.Read y Stream.Write aceptan compensaciones 'int' mientras Stream.Length es largo ... ¡duh! la fragmentación ni siquiera está prevista. – chakrit

+1

porque a menos que esté trabajando en una computadora de 20 años (con 16 bit RAM) o usando almacenamiento comprimido en una estructura optimizada de memoria, –

0

Si solo estamos hablando de un par de números, elegir el más grande no hará una diferencia notable en el uso general de ram y funcionará. Si está hablando de muchos números, necesitará usar TryParse() sobre ellos y descubrir el tipo de letra int más pequeño, para ahorrar memoria RAM.

0

Todas las computadoras son finitas. Debe definir un límite superior en función de lo que crea que serán los requisitos de los usuarios.

Si realmente no tiene límite superior y quiere permitir valores 'ilimitados', intente agregar las bibliotecas de tiempo de ejecución de .Net Java a su proyecto, lo que le permitirá usar la clase java.math.BigInteger, que hace cálculos matemáticos número entero casi ilimitado.

Nota: Las bibliotecas .Net Java vienen con DevStudio completo, pero no creo que vengan con Express.

9

Solo quería agregar que ... Recordé que en los días de .NET 1.1 el compilador estaba optimizado de modo que las operaciones 'int' de son realmente más rápidas que las operaciones de byte o short.

Creo que todavía se mantiene hoy, pero ahora estoy realizando algunas pruebas.


EDIT: He conseguido un descubrimiento sorprendente: el complemento, restar y multiplicar las operaciones de corto (s) vuelven en realidad int!

3

Probar varias veces TryParse() no tiene sentido, ya tiene un campo declarado. No puedes cambiar de opinión a menos que hagas ese campo de tipo Object. No es Buena idea.

Cualquier dato que el campo representa tiene un significado físico. Es una edad, un tamaño, un conteo, etc. Las cantidades físicas tienen restricciones realistas en su rango. Elija el tipo int que puede almacenar ese rango. No trates de arreglar un desbordamiento, sería un error.

+0

¡Una voz de la razón! –

1

Contrariamente a la respuesta más popular actual, los enteros más cortos (como Int16 y SByte) a menudo ocupan menos espacio en la memoria que los enteros más grandes (como Int32 e Int64).Puede verificar esto fácilmente instanciando grandes arreglos de sbyte/short/int/long y usando perfmon para medir los tamaños de almacenamiento dinámico administrados. Es cierto que muchos de los sabores de CLR ampliarán estos enteros para optimizaciones específicas de la CPU al hacer aritmética en ellos y demás, pero cuando se almacenan como parte de un objeto, ocupan solo la cantidad de memoria necesaria.

Por lo tanto, definitivamente debe tener en cuenta el tamaño, especialmente si va a trabajar con una gran lista de enteros (o con una gran lista de objetos que contienen campos enteros). También debe considerar aspectos como el cumplimiento de CLS (que no permite el uso de enteros sin firmar en miembros públicos).

Para casos simples como convertir una cadena en un entero, acepto que Int32 (C# int) suele tener más sentido y es probable que otros programadores esperen.

Cuestiones relacionadas