¿Debo usar int o Int32

352

En C #, inty Int32son lo mismo, pero he leído varias veces que intes preferible Int32sin ninguna razón dada. ¿Hay alguna razón y debería importarme?

Graham
fuente
Tuitea por el Skeet sobre esto, donde favorece Int32 sobre int cuando programa API.
Comecme
@JohnBubriski: y no olvidemos que requiere menos declaraciones de uso para usarlo (o estaría escribiendo System.Int32)
sehe
Tengo una pregunta: no estamos usando el tipo CLR directamente, pero ¿por qué los necesitamos?
AminM
La actualización del estado de @JohnBubriski en Facebook es más fácil de escribir que una pieza de código. ¡Mal pensamiento allí! Más fácil de leer y entender es mucho más importante que más fácil de escribir. When something can be read without effort, great effort has gone into its writing. Easy writing is hard reading
7hi4g0

Respuestas:

134

ECMA-334 : 2006 C # Especificación del lenguaje (p18):

Cada uno de los tipos predefinidos es una forma abreviada de un tipo proporcionado por el sistema. Por ejemplo, la palabra clave se intrefiere a la estructura System.Int32. Como cuestión de estilo, se favorece el uso de la palabra clave sobre el uso del nombre completo del tipo de sistema.

SpaceghostAli
fuente
271

Los dos son sinónimo; intserá un poco más familiar, Int32hace que la 32 bits sea más explícita para aquellos que leen su código Me inclinaría a usar intdonde solo necesito 'un número entero', Int32donde el tamaño es importante (código criptográfico, estructuras) para que los futuros mantenedores sepan que es seguro agrandarlo intsi es apropiado, pero deben tener cuidado de cambiarlo Int32de la misma manera.

El código resultante será idéntico: la diferencia es puramente legible o la apariencia del código.

usuario6779
fuente
65
Las personas que leen su código deben saber que int es un alias para System.Int32. En cuanto a la legibilidad, la consistencia es mucho más importante.
Troels Thomsen
11
Para aquellos de ustedes con la antigua mentalidad de C ++, IntPtr está diseñado para tener 32 bits en un sistema operativo de 32 bits y 64 bits en un sistema operativo de 64 bits. Este comportamiento se menciona específicamente en su etiqueta de resumen. msdn.microsoft.com/en-us/library/system.intptr(VS.71).aspx
diadem
87

Ambos declaran números enteros de 32 bits y, como lo indicaron otros carteles, el que usas es principalmente una cuestión de estilo sintáctico. Sin embargo, no siempre se comportan de la misma manera. Por ejemplo, el compilador de C # no permitirá esto:

public enum MyEnum : Int32
{
    member1 = 0
}

pero permitirá esto:

public enum MyEnum : int
{
    member1 = 0
}

Imagínate.

cuervo
fuente
99
Si usa Reflector para examinar el tipo System.Int32, encontrará que es una estructura y no una clase. El código se ve así: [Serializable, StructLayout (LayoutKind.Sequential), ComVisible (true)] public struct Int32: IComparable, IFormattable, IConvertible, IComparable <int>, IEquatable <int> {public const int MaxValue = 0x7fffffff; ... No puede derivar un tipo de una estructura. Como mínimo, recibirá un error que se lo indica. Sin embargo, el comportamiento de la enumeración es un poco diferente, lo que comentaré a continuación.
raddevus
16
La incapacidad para derivar una enumeración de Int32 es un comportamiento diseñado, que también se puede ver mirando el código .NET: [Serializable, ComVisible (verdadero)] clase abstracta pública Enum: ValueType, IComparable, IFormattable, Observe que Enum se deriva de ValueType? Si intenta derivar una enumeración de otra cosa además de un tipo de datos intrínseco (int, byte, etc.), recibirá un error similar al siguiente: Escriba byte, sbyte, short, ushort, int, uint, long o ulong esperado .
raddevus
2
@daylight tenga en cuenta que especificar un enumpara usar intno es un derive, pero especifica un underlying type; ver msdn.microsoft.com/en-us/library/sbbt4032.aspx#code-snippet-2
Jeroen Wiert Pluimers
2
@JeroenWiertPluimers Sin embargo, sigue siendo interesante por qué han elegido verificar literalmente el tipo subyacente y lanzar CS1008 , ya que el tipo subyacente es solo el tipo de las constantes en la enumeración, por lo que realmente no importa cuando se compila.
IllidanS4 quiere que Monica regrese el
55
@ IllidanS4, con el nuevo compilador Roslyn - esto fue corregido, y ambas variantes válidas
Grundy
49

Siempre uso los tipos de sistema, por ejemplo, en Int32lugar de int. Adopté esta práctica después de leer la Programación de .NET Framework aplicada : el autor Jeffrey Richter es un buen caso para usar los nombres de tipo completo. Aquí están los dos puntos que me quedaron:

  1. Los nombres de los tipos pueden variar entre los lenguajes .NET. Por ejemplo, en C #, longasigna a System.Int64 mientras que en C ++ con extensiones administradas, longasigna a Int32. Dado que los idiomas se pueden combinar y combinar mientras se usa .NET, puede estar seguro de que usar el nombre de clase explícito siempre será más claro, sin importar el idioma preferido del lector.

  2. Muchos métodos de marco tienen nombres de tipo como parte de sus nombres de método:

    BinaryReader br = new BinaryReader( /* ... */ );
    float val = br.ReadSingle();     // OK, but it looks a little odd...
    Single val = br.ReadSingle();    // OK, and is easier to read
Remi Despres-Smyth
fuente
Un problema con esto es que el autocompletado de Visual Studio todavía usa int. Entonces, si hace un List<Tuple<Int32, Boolean>> test = new, Visual Studio ahora se insertará List<Tuple<int, bool>>(). ¿Conoces una manera de cambiar estos autocompletados?
MrFox
2
Sí, es un problema; No, no sé cómo cambiarlos de forma espontánea. El punto # 2 ya no es un problema para mí, ya que tiendo a usar vartodo lo posible para reducir la palabrería del código. En esos lugares ocasionales donde el autocompletado entra y escupe en mi piso, me ajusto manualmente, es literalmente uno o dos segundos de mi tiempo.
Remi Despres-Smyth
20

int es una palabra clave de C # y no es ambigua.

La mayoría de las veces no importa, pero hay dos cosas que van en contra de Int32:

  • Necesita tener un "sistema de uso"; declaración. el uso de "int" no requiere una declaración de uso.
  • Es posible definir su propia clase llamada Int32 (que sería tonto y confuso). int siempre significa int.
Duende
fuente
También es posible crear su propia clase 'var', pero eso no desalienta a las personas a usarla.
Neme
Cada palabra clave es una palabra clave C #. int ya se usaba en C y C ++. Entonces no hay nada específicamente C # al respecto.
MrFox
12

Como ya se dijo, int= Int32. Para estar seguro, asegúrese de usar siempre int.MinValue/ int.MaxValueal implementar cualquier cosa que se preocupe por los límites del tipo de datos. Suponga que .NET decidió que intahora sería Int64, su código dependería menos de los límites.

Spoulson
fuente
8
@spoulson: Error de comentario en la línea 1: Asignación prohibida entre tipos iguales. Sí, un chiste malo.
Johann Gerell el
22
Si el C # spec (es un C #, no toma .NET) alguna vez de cambiar para hacer int64 bits, eso sería como un cambio de última hora que yo no creo que sea posible (o ciertamente sensible) al código defensiva contra tales eventualidades.
Jon Skeet
9

El tamaño de los bytes para los tipos no es demasiado interesante cuando solo tiene que lidiar con un solo idioma (y para el código que no tiene que recordar sobre desbordamientos matemáticos). La parte que se vuelve interesante es cuando haces un puente entre un idioma y otro, C # a un objeto COM, etc., o estás haciendo algunos cambios de bits o enmascarando y necesitas recordarte a ti mismo (y a tus compañeros de trabajo de revisión de código) del tamaño de los datos.

En la práctica, generalmente uso Int32 solo para recordarme de qué tamaño son porque escribo C ++ administrado (para conectar a C #, por ejemplo), así como C ++ no administrado / nativo.

Siempre que probablemente sepa, en C # es de 64 bits, pero en C ++ nativo, termina en 32 bits, o char es unicode / 16 bits, mientras que en C ++ es de 8 bits. ¿Pero cómo sabemos esto? La respuesta es, porque lo buscamos en el manual y así lo dijo.

Con el tiempo y las experiencias, comenzará a ser más consciente de los tipos cuando escriba códigos para unir entre C # y otros lenguajes (algunos lectores aquí piensan "¿por qué lo harían?"), Pero en mi humilde opinión, creo que es una mejor práctica porque No puedo recordar lo que he codificado la semana pasada (o no tengo que especificar en mi documento API que "este parámetro es un entero de 32 bits").

En F # (aunque nunca lo he usado), definen int , int32 y nativeint . La misma pregunta debería surgir, "¿cuál uso?". Como otros han mencionado, en la mayoría de los casos, no debería importar (debería ser transparente). Pero por mi parte, elegiría int32 y uint32 solo para eliminar las ambigüedades.

Supongo que solo dependerá de qué aplicaciones esté codificando, quién lo esté usando, qué prácticas de codificación siguen usted y su equipo, etc. para justificar cuándo usar Int32.

HidekiAI
fuente
¿Eso no invalida el propósito de .net? De todos modos, qué es F #, una idea que Gates tuvo que desapareció con su retiro ...
Nick Turner
8

No hay diferencia entre inty Int32, pero como intes una palabra clave del lenguaje, muchas personas la prefieren estilísticamente (al igual que con stringvs String).

Simon Steele
fuente
7

En mi experiencia ha sido una convención. No conozco ninguna razón técnica para usar int sobre Int32, pero es:

  1. Más rápido para escribir.
  2. Más familiar para el desarrollador típico de C #.
  3. Un color diferente en el resaltado de sintaxis visual de estudio predeterminado.

Me gusta especialmente el último. :)

Greg D
fuente
7

Siempre uso los tipos con alias (int, string, etc.) al definir una variable y uso el nombre real al acceder a un método estático:

int x, y;
...
String.Format ("{0}x{1}", x, y);

Simplemente parece feo ver algo como int. TryParse (). No hay otra razón para hacer esto que no sea estilo.

Mark A. Nicolosi
fuente
5

Sé que la mejor práctica es usar int, y todo el código MSDN usa int. Sin embargo, no hay una razón más allá de la estandarización y la coherencia, que yo sepa.

Raithlin
fuente
5

Aunque son (en su mayoría) idénticos (vea a continuación la diferencia de un [error]), definitivamente debería importarle y debería usar Int32.

  • El nombre para un entero de 16 bits es Int16. Para un entero de 64 bits es Int64, y para un entero de 32 bits la opción intuitiva es: int o Int32?

  • La cuestión del tamaño de una variable de tipo Int16, Int32 o Int64 es autorreferenciada, pero la cuestión del tamaño de una variable de tipo int es una pregunta perfectamente válida y las preguntas, no importa cuán triviales, distraigan, conducen a confusión, pérdida de tiempo, obstaculizar la discusión, etc. (el hecho de que esta pregunta exista prueba el punto).

  • El uso de Int32 promueve que el desarrollador sea consciente de su elección de tipo. ¿Qué tan grande es un int de nuevo? Oh sí, 32. La probabilidad de que el tamaño del tipo se considere realmente es mayor cuando el tamaño se incluye en el nombre. Usar Int32 también promueve el conocimiento de las otras opciones. Cuando las personas no se ven obligadas a reconocer al menos que existen alternativas, resulta demasiado fácil para int convertirse en "EL tipo entero".

  • La clase dentro del marco destinada a interactuar con enteros de 32 bits se llama Int32. Una vez más, que es: más intuitivo, menos confuso, carece de una traducción (innecesaria) (no una traducción en el sistema, sino en la mente del desarrollador), etc. ¿ int lMax = Int32.MaxValueo Int32 lMax = Int32.MaxValue?

  • int no es una palabra clave en todos los lenguajes .NET.

  • Aunque existen argumentos por los cuales no es probable que cambie, int puede no ser siempre un Int32.

Los inconvenientes son dos caracteres adicionales para escribir y [error].

Esto no compilará

public enum MyEnum : Int32
{
    AEnum = 0
}

Pero esto:

public enum MyEnum : int
{
    AEnum = 0
}
desconocidos (yahoo)
fuente
Usted dice "El nombre para un número entero de 16 bits es Int16, para un número entero de 64 bits es Int64, y para un número entero de 32 bits la opción intuitiva es: int o Int32?", Pero también hay palabras clave C # para estos. Int16 = corto Int64 = largo Así que el punto uno de su respuesta se basa en una suposición incorrecta.
Mel
"La variable de tipo int es una pregunta y preguntas perfectamente válidas, no importa cuán triviales sean, distraen, conducen a confusión, pierden tiempo, dificultan la discusión, etc. (el hecho de que esta pregunta exista lo demuestra)". ¿Me estás tomando el pelo? Trabajas en un lenguaje que no entiendes completamente lo que hay detrás del capó. Si el desarrollador no entiende a qué se asemeja el tipo primitivo, debería dedicarse a las artes culinarias. Suena como un desarrollador de VB. El uso de primitivas es nativo de cualquier idioma y debe preferirse. Está bien si no te gustan las primitivas, pero no inventes realidades.
Nick Turner
Hmm, estoy totalmente en desacuerdo con tu opinión de que debería importarme ... pero no sabía que las enumeraciones solo pueden heredarse de las palabras clave. Un hecho bastante inútil, pero aún divertido de saber :)
Jowen
4

No te debe importar. Deberías usar la intmayor parte del tiempo. Ayudará a portar su programa a una arquitectura más amplia en el futuro (actualmente intes un alias System.Int32pero eso podría cambiar). Solo cuando el ancho de bits de la variable es importante (por ejemplo: para controlar el diseño en memoria de a struct) debe usar int32y otros (con el " using System;" asociado ).

yhdezalvarez
fuente
1
No puedes hablar en serio ... ¿facilitar el transporte? No creo que encontrar y reemplazar sea un gran problema.
Vince Panuccio
2
(actualmente int es un alias de System.Int32 pero eso podría cambiar) ? Oh vamos uno ... ¿Hablas en serio?
Oybek
¿Por qué escribirías el código en un idioma que eventualmente desecharías? Parece que por decisión de la gerencia. Use int o Int32. Int32 parece VB
Nick Turner
Lo que quise decir es que MAYBE, (y eso es un gran MAYBE, realmente no sé por qué los diseñadores lo hicieron de esa manera) debería tener una manera de declarar un int que tenga el mismo ancho que el arco en el que se está ejecutando, como C's int / long / ... funciona. Este es un mecanismo (int alias int32) que parece diseñado para hacer exactamente esto. Y tenga en cuenta que Microsoft siempre recomienda usar "int" frente a "Int32" (tal como lo harían si esta fuera su intención original). Lo sé, eso es un gran IF ... Cuando escribí esta respuesta, no había ningún marco .NET de 64 bits, así que no sabía qué harían en ese caso.
Yanko Hernández Alvarez
3

int es el acceso directo del lenguaje C # para System.Int32

Si bien esto significa que Microsoft podría cambiar esta asignación, una publicación sobre las discusiones de FogCreek declaró [fuente]

"Sobre el problema de 64 bits: Microsoft está trabajando en una versión de 64 bits de .NET Framework, pero estoy bastante seguro de que int NO se asignará a 64 bits en ese sistema.

Razones:

1. El estándar C # ECMA dice específicamente que int es de 32 bits y el largo es de 64 bits.

2. Microsoft introdujo propiedades y métodos adicionales en Framework versión 1.1 que devuelven valores largos en lugar de valores int, como Array.GetLongLength además de Array.GetLength.

Así que creo que es seguro decir que todos los tipos integrados de C # mantendrán su asignación actual ".

Ray Hayes
fuente
Si se introduce una versión de 64 bits, probablemente agregarán 'nativeint' a C # (como se usa actualmente en F #). ¡Esto solo refuerza que introducir el 'int' y definir esto como un Int32 fue un error! Y es tan inconsistente desde un punto de vista de API (es decir, ReadInt32 no ReadInt), color (oscuro vs azul claro) y mayúsculas y minúsculas (DateTime vs int). es decir, ¿por qué el tipo de valor 'DateTime' no tiene un alias como Int32?
Carlo Bos
3

int es lo mismo que System.Int32 y cuando se compila se convertirá en lo mismo en CIL .

Usamos int por convención en C # ya que C # quiere parecerse a C y C ++ (y Java) y eso es lo que usamos allí ...

Por cierto, termino usando System.Int32 cuando declaro importaciones de varias funciones de API de Windows. No estoy seguro de si esta es una convención definida o no, pero me recuerda que voy a una DLL externa ...

Jack Bolding
fuente
3

Érase una vez, el tipo de datos int estaba vinculado al tamaño de registro de la máquina objetivo del compilador. Entonces, por ejemplo, un compilador para un sistema de 16 bits usaría un entero de 16 bits.

Sin embargo, por suerte que no vemos mucho de 16 bits más, y cuando 64 bits comenzado a hacer que la gente populares estaban más preocupados por lo que es compatible con el software antiguo y 32 bits había sido por tanto tiempo que para la mayoría de los compiladores un int se supone que tiene 32 bits.

Peter Mortensen
fuente
3

Recomiendo usar StyleCop de Microsoft .

Es como FxCop , pero por cuestiones relacionadas con el estilo. La configuración predeterminada coincide con las guías de estilo internas de Microsoft, pero se puede personalizar para su proyecto.

Puede tomar un tiempo acostumbrarse, pero definitivamente hace que su código sea más agradable.

Puede incluirlo en su proceso de compilación para verificar automáticamente las violaciones.

devstuff
fuente
Estoy completamente en desacuerdo con StyleCop en este caso. sí, es bueno, pero prefiero usar Int32, ¿por qué? para evitar respuestas como las dos que han sido rechazadas. La gente confunde Int32 con la forma en que se representan las entradas en C
John Demetriou
2

intY Int32es lo mismo. intes un alias para Int32.

Jesper Kihlberg
fuente
int no es un alias, es una palabra clave. Ver las otras respuestas.
Timores
int es definitivamente una palabra clave para el lenguaje, pero también se puede llamar un alias de System.Int32. Además, otra forma de pensar en esto es que tiene una using int = System.Int32; directiva para todos sus archivos de código fuente.
uygar donduran
2

No te debe importar. Si el tamaño es una preocupación, usaría byte, short, int, luego long. La única razón por la que usaría un int mayor que int32 es si necesita un número mayor que 2147483647 o menor que -2147483648.

Aparte de eso, no me importaría, hay muchos otros elementos de los que preocuparse.

David Basarab
fuente
Añadiría que puede usar la palabra clave "long" en lugar de System.Int64
Keith
22
No entendiste la pregunta. El OP pregunta si hay una diferencia entre las declaraciones "int i" e "Int32 i".
cuervo
2

No importa en la práctica y con el tiempo adoptará su propia convención. Tiendo a usar la palabra clave cuando asigno un tipo, y la versión de clase cuando uso métodos estáticos y tal:

int total = Int32.Parse("1009");
chrisb
fuente
1

Uso int en el caso de que Microsoft cambie la implementación predeterminada para un entero a alguna versión nueva (llamémosla Int32b).

Luego, Microsoft puede cambiar el alias int a Int32b, y no tengo que cambiar ninguno de mis códigos para aprovechar su nueva implementación entera (y con suerte mejorada).

Lo mismo ocurre con cualquiera de las palabras clave de tipo.

anon
fuente
0

No debería importarle la mayoría de los lenguajes de programación, a menos que necesite escribir funciones matemáticas muy específicas o un código optimizado para una arquitectura específica ... Solo asegúrese de que el tamaño del tipo sea suficiente para usted (use algo más grande que un Int si sabe que necesitará más de 32 bits, por ejemplo)

Apilador
fuente
0

No importa. int es la palabra clave del idioma e Int32 es su tipo de sistema real.

Vea también mi respuesta aquí a una pregunta relacionada.

Keith
fuente
0

El uso de Int o Int32 son los mismos Int es solo azúcar para simplificar el código para el lector.

Utilice la variante Nullable Int? o Int32? cuando trabaja con bases de datos en campos que contienen nulo. Eso te ahorrará muchos problemas de tiempo de ejecución.

bovium
fuente
0

Algunos compiladores tienen diferentes tamaños para int en diferentes plataformas (no específicas de C #)

Algunos estándares de codificación (MISRA C) requieren que todos los tipos utilizados tengan un tamaño especificado (es decir, Int32 y no int).

También es bueno especificar prefijos para diferentes variables de tipo (por ejemplo, b para bytes de 8 bits, w para palabras de 16 bits yl para palabras de 32 bits => Int32 lMyVariable)

Debes preocuparte porque hace que tu código sea más portátil y más fácil de mantener.

Portable puede no ser aplicable a C # si siempre va a usar C # y la especificación de C # nunca cambiará a este respecto.

El ihmo mantenible siempre será aplicable, porque la persona que mantiene su código puede no estar al tanto de esta especificación particular de C #, y omitir un error cuando el int ocasionalmente se convierte en más de 2147483647.

En un bucle for simple que cuenta, por ejemplo, los meses del año, no le importará, pero cuando use la variable en un contexto en el que posiblemente podría fluir, debería importarle.

También debería preocuparte si vas a hacer operaciones con bits en él.

usuario11211
fuente
No hace ninguna diferencia en .Net - int siempre es Int32 y long siempre es Int64
Keith
It is also good to specify prefixes for different type variablesLa notación húngara está en gran parte desaprobada hoy en día y la mayoría de los estilos de codificación desalientan su uso. Las convenciones internas de las compañías de software también a menudo prohíben esa notación
phuclv
0

El uso del Int32tipo requiere una referencia de espacio de nombres Systemo calificación completa ( System.Int32). Tiendo hacia int, porque no requiere una importación de espacio de nombres, por lo tanto, reduciendo la posibilidad de colisión del espacio de nombres en algunos casos. Cuando se compila a IL, no hay diferencia entre los dos.

Michael Meadows
fuente
0

De acuerdo con la ventana Inmediato en Visual Studio 2012, Int32 es int, Int64 es largo. Aquí está la salida:

sizeof(int)
4
sizeof(Int32)
4
sizeof(Int64)
8
Int32
int
    base {System.ValueType}: System.ValueType
    MaxValue: 2147483647
    MinValue: -2147483648
Int64
long
    base {System.ValueType}: System.ValueType
    MaxValue: 9223372036854775807
    MinValue: -9223372036854775808
int
int
    base {System.ValueType}: System.ValueType
    MaxValue: 2147483647
    MinValue: -2147483648
Selim
fuente
0

Considere también Int16. Si necesita almacenar un número entero en la memoria en su aplicación y le preocupa la cantidad de memoria utilizada, entonces podría usar Int16 ya que usa menos memoria y tiene un rango mínimo / máximo menor que Int32 (que es lo que es int .)

Chris Pietschmann
fuente
0

Hace un tiempo, estaba trabajando en un proyecto con Microsoft cuando recibimos la visita de alguien del equipo de productos Microsoft .NET CLR. Esta persona codificó ejemplos y cuando definió sus variables usó “Int32” vs. “int” y “String” vs. “string”.

Había recordado haber visto este estilo en otro código de ejemplo de Microsoft. Entonces, investigué un poco y descubrí que todo el mundo dice que no hay diferencia entre "Int32" e "int", excepto el color de sintaxis. De hecho, encontré una gran cantidad de material que sugiere que use "Int32" para que su código sea más legible. Entonces, adopté el estilo.

¡El otro día encontré la diferencia! El compilador no le permite escribir enum usando "Int32", pero sí cuando usa "int". No me preguntes por qué porque aún no lo sé.

Ejemplo:

public  enum MyEnum : Int32
{
    AEnum = 0
}

Esto funciona.

public enum MyEnum : int
{
    AEnum = 0
}

Tomado de: notación Int32 vs. int

Schmuli
fuente