it-swarm-pt.tech

Devo usar int ou Int32

Em C #, int e Int32 são a mesma coisa, mas eu li um número de vezes que int é preferido sobre Int32 sem nenhuma razão dada. Existe uma razão e devo me importar?

339
Graham

ECMA-334 : 2006 Especificação da linguagem C # (p18):

Cada um dos tipos predefinidos é uma forma abreviada de um tipo fornecido pelo sistema. Por exemplo, a palavra-chave int refere-se à estrutura System.Int32. Por uma questão de estilo, o uso da palavra-chave é favorecido sobre o uso do nome completo do tipo de sistema.

125
SpaceghostAli

Os dois são de fato sinônimos; int será um pouco mais familiar, Int32 torna o bit de 32 bits mais explícito para aqueles que lêem seu código. Eu estaria inclinado a usar int onde eu só preciso de 'um inteiro', Int32 onde o tamanho é importante (código criptográfico, estruturas) para que futuros mantenedores saibam que é seguro aumentar um int se apropriado, mas deve tomar cuidado ao alterar Int32s no mesmo caminho.

O código resultante será idêntico: a diferença é puramente de legibilidade ou aparência de código.

265
James Sutherland

Ambos declaram números inteiros de 32 bits, e como outros pôsteres declararam, qual deles você usa é mais uma questão de estilo sintático. No entanto, eles nem sempre se comportam da mesma maneira. Por exemplo, o compilador C # não permitirá isso:

public enum MyEnum : Int32
{
    member1 = 0
}

mas permitirá isso:

public enum MyEnum : int
{
    member1 = 0
}

Vai saber.

84
raven

Eu sempre uso os tipos de sistema - por exemplo, Int32 em vez de int. Eu adotei essa prática depois de ler Applied .NET Framework Programming - autor Jeffrey Richter faz um bom exemplo para usar os nomes de tipo completo . Aqui estão os dois pontos que ficaram comigo:

  1. Os nomes de tipos podem variar entre os idiomas do .NET. Por exemplo, em C #, long mapeia para System.Int64 enquanto em C++ com extensões gerenciadas, long mapeia para Int32. Como os idiomas podem ser combinados e combinados durante o uso do .NET, você pode ter certeza de que o uso do nome de classe explícito será sempre mais claro, independentemente do idioma preferido do leitor.

  2. Muitos métodos de framework possuem nomes de tipos como parte de seus nomes de métodos:

    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

48
Remi Despres-Smyth

int é uma palavra-chave do C # e não é ambígua.

Na maioria das vezes, não importa, mas duas coisas vão contra o Int32:

  • Você precisa ter um "sistema usando"; declaração. usar "int" não requer declaração de uso.
  • É possível definir sua própria classe chamada Int32 (o que seria tolo e confuso). int sempre significa int.
20
Brownie

Como já foi dito, int = Int32. Para estar seguro, certifique-se de sempre usar int.MinValue/int.MaxValue ao implementar qualquer coisa que se importe com os limites de tipo de dados. Suponha que o .NET decidisse que int seria agora Int64, seu código seria menos dependente dos limites.

13
spoulson

O tamanho do byte para tipos não é muito interessante quando você tem que lidar apenas com um único idioma (e para o código que você não precisa se lembrar sobre overflow de matemática). A parte que se torna interessante é quando você faz a ponte entre um idioma para outro, C # para o objeto COM, etc., ou você está mudando ou mascarando e precisa se lembrar (e seus co-operadores de revisão de código) do tamanho dos dados.

Na prática, eu costumo usar o Int32 apenas para me lembrar de que tamanho eles são, porque eu escrevo o C++ gerenciado (para fazer a ponte para o C #, por exemplo), bem como o C++ não gerenciado/nativo.

Por muito tempo que você provavelmente saiba, em C # é de 64 bits, mas em C++ nativo, ele termina em 32 bits, ou char é unicode/16 bits, enquanto em C++ é de 8 bits. Mas como sabemos disso? A resposta é, porque nós procuramos no manual e ele disse isso.

Com o tempo e as experiências, você começará a ser mais consciente quando escrever códigos para fazer a ponte entre C # e outras linguagens (alguns leitores estão pensando "por que você?"), Mas IMHO eu acredito que seja uma prática melhor porque Não me lembro o que codifiquei na semana passada (ou não preciso especificar no meu documento de API que "este parâmetro é um inteiro de 32 bits").

Em F # (embora eu nunca tenha usado), eles definem int , int32 e nativeint . A mesma pergunta deve surgir, "qual eu uso?". Como outros já mencionaram, na maioria dos casos, não deve importar (deve ser transparente). Mas eu, pelo menos, escolheria int32 e uint32 apenas para remover as ambiguidades.

Eu acho que isso dependeria apenas de quais aplicativos você está codificando, quem está usando, quais práticas de codificação você e sua equipe seguem, etc. para justificar quando usar o Int32.

9
HidekiAI

Não há diferença entre int e Int32, mas como int é uma palavra-chave do idioma, muitas pessoas preferem estilisticamente (assim como com string vs String).

8
Simon Steele

Na minha experiência, tem sido uma coisa de convenção. Não tenho conhecimento de nenhum motivo técnico para usar o int no Int32, mas é:

  1. Mais rápido para digitar.
  2. Mais familiar para o típico desenvolvedor C #.
  3. Uma cor diferente no destaque da sintaxe do Visual Studio padrão.

Eu gosto especialmente desse último. :)

7
Greg D

Eu sempre uso os tipos de alias (int, string, etc.) ao definir uma variável e usar o nome real ao acessar um método estático:

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

Parece feio ver algo como int.TryParse (). Não há outro motivo para fazer isso além do estilo.

6
Mark A. Nicolosi

Embora eles sejam (na maior parte) idênticos (veja abaixo a diferença [bug]), você definitivamente deveria se importar e deveria usar o Int32.

  • O nome para um inteiro de 16 bits é Int16. Para um inteiro de 64 bits é Int64, e para um inteiro de 32 bits a escolha intuitiva é: int ou Int32?

  • A questão do tamanho de uma variável do tipo Int16, Int32 ou Int64 é auto-referência, mas a questão do tamanho de uma variável do tipo int é uma questão perfeitamente válida e as questões, não importa quão triviais, distraem, levam a confusão, perder tempo, dificultar a discussão, etc. (o fato de que essa questão existe prova o ponto).

  • O uso do Int32 promove que o desenvolvedor tenha consciência de sua escolha de tipo. Quão grande é um int novamente? Sim, 32. A probabilidade de o tamanho do tipo ser realmente considerado é maior quando o tamanho é incluído no nome. O uso do Int32 também promove o conhecimento das outras opções. Quando as pessoas não são forçadas a, pelo menos, reconhecer que existem alternativas, torna-se muito fácil para o int se tornar "THE integer type".

  • A classe dentro da estrutura destinada a interagir com números inteiros de 32 bits é denominada Int32. Mais uma vez, o que é mais intuitivo, menos confuso, carece de uma tradução (desnecessária) (não uma tradução no sistema, mas na mente do desenvolvedor), etc. int lMax = Int32.MaxValue ou Int32 lMax = Int32.MaxValue?

  • int não é uma palavra-chave em todos os idiomas .NET.

  • Embora haja argumentos por que é provável que nunca mude, nem sempre int pode ser um Int32.

As desvantagens são dois caracteres extras para digitar e [bug].

Isso não vai compilar

public enum MyEnum : Int32
{
    AEnum = 0
}

Mas isso vai:

public enum MyEnum : int
{
    AEnum = 0
}
5
unknown (yahoo)

Eu sei que a melhor prática é usar int, e todo o código do MSDN usa int. No entanto, não há uma razão além da padronização e consistência, tanto quanto eu sei.

5
Raithlin

Você não deveria se importar. Você deve usar int na maioria das vezes. Isso ajudará a portar seu programa para uma arquitetura mais ampla no futuro (atualmente int é um alias para System.Int32, mas isso pode mudar). Somente quando a largura de bits da variável é importante (por exemplo: para controlar o layout na memória de um struct) você deve usar int32 e outros (com o associado "using System;").

4
yhdezalvarez

Eu recomendo usar o Microsoft StyleCop .

É como FxCop , mas para questões relacionadas ao estilo. A configuração padrão corresponde aos guias de estilo internos da Microsoft, mas pode ser personalizada para o seu projeto.

Pode demorar um pouco para se acostumar, mas definitivamente faz seu código mais agradável.

Você pode incluí-lo em seu processo de criação para verificar automaticamente violações.

3
devstuff

int é o mesmo que System.Int32 e quando compilado, ele se transformará na mesma coisa em CIL .

Nós usamos int por convenção em C #, já que o C # quer se parecer com C e C++ (e Java) e é isso que usamos lá ...

BTW, eu acabo usando System.Int32 ao declarar as importações de várias funções da API do Windows. Eu não tenho certeza se esta é uma convenção definida ou não, mas me lembra que eu estou indo para uma DLL externa ...

3
Jack Bolding

Uma vez, o tipo de dados int foi atrelado ao tamanho do registro da máquina visada pelo compilador. Assim, por exemplo, um compilador para um sistema de 16 bits usaria um inteiro de 16 bits.

No entanto, felizmente não vemos muito mais de 16 bits, e quando o 64-bit começou a ficar popular as pessoas estavam mais preocupadas em torná-lo compatível com software antigo e o 32-bit existia há tanto tempo que para a maioria dos compiladores int é apenas assumido como sendo 32 bits.

3
Joel Coehoorn

int é o atalho da linguagem C # para System.Int32

Embora isso signifique que a Microsoft poderia alterar esse mapeamento, um post nas discussões do FogCreek afirmou [source]

"No problema de 64 bits - a Microsoft está realmente trabalhando em uma versão de 64 bits do .NET Framework, mas tenho certeza que int NÃO mapeará para 64 bits nesse sistema.

Razões:

1. O padrão C # ECMA diz especificamente que int é de 32 bits e o comprimento é de 64 bits

2. A Microsoft introduziu propriedades e métodos adicionais no Framework versão 1.1 que retornam valores longos em vez de valores int, como Array.GetLongLength além de Array.GetLength.

Então, eu acho que é seguro dizer que todos os tipos de C # embutidos manterão seus mapeamentos atuais. "

3
Ray Hayes

Você não deve se importar. Se o tamanho é uma preocupação, eu usaria byte, short, int e long. A única razão pela qual você usaria um int maior que int32 é se você precisa de um número maior que 2147483647 ou menor que -2147483648.

Diferente do que eu não me importo, há muitos outros itens para se preocupar.

2
David Basarab

int e Int32 é o mesmo. int é um apelido para Int32.

2
Jesper Kihlberg

Não faz diferença na prática e com o tempo você adotará sua própria convenção. Costumo usar a palavra-chave ao atribuir um tipo e a versão da classe ao usar métodos estáticos e semelhantes:

int total = Int32.Parse ("1009");

2
chrisb

int é um alias para System.Int32, conforme definido nesta tabela: Tabela de Tipos Internos (Referência C #)

1
Jim T

O uso de Int ou Int32 é o mesmo Int é apenas açúcar para simplificar o código para o leitor.

Use a variante Nullable Int? ou Int32? quando você trabalha com bancos de dados em campos contendo nulo. Isso salvará você de muitos problemas de tempo de execução.

0
bovium

Um tempo atrás eu estava trabalhando em um projeto com a Microsoft quando tivemos a visita de alguém na equipe de produtos Microsoft .NET CLR. Esta pessoa codificou exemplos e quando ele definiu suas variáveis, ele usou “Int32” vs. “int” e “String” vs. “string”.

Eu tinha me lembrado de ver esse estilo em outro código de exemplo da Microsoft. Então, fiz algumas pesquisas e descobri que todos dizem que não há diferença entre o “Int32” e o “int”, exceto pela coloração da sintaxe. De fato, achei muito material sugerindo que você usasse “Int32” para tornar seu código mais legível. Então, eu adotei o estilo.

No outro dia eu encontrei uma diferença! O compilador não permite que você digite enum usando o "Int32", mas sim quando você usa "int". Não me pergunte porque, porque eu ainda não sei.

Exemplo:

public  enum MyEnum : Int32
{
    AEnum = 0
}

Isso funciona.

public enum MyEnum : int
{
    AEnum = 0
}

Retirado de: Int32 notation vs. int

0
Schmuli

Alguns compiladores têm tamanhos diferentes para int em diferentes plataformas (não específicas do C #)

Alguns padrões de codificação (MISRA C) exigem que todos os tipos utilizados tenham tamanho especificado (ou seja, Int32 e não int).

Também é bom especificar prefixos para variáveis ​​de tipo diferentes (por exemplo, b para o byte de 8 bits, w para o Word de 16 bits e l para o Word de 32 bits de comprimento => Int32 lMyVariable)

Você deve se importar porque isso torna seu código mais portátil e mais fácil de manter.

Portátil pode não ser aplicável ao C # se você sempre for usar o C # ea especificação C # nunca será alterada nesse sentido.

Ihmo sustentável sempre será aplicável, porque a pessoa que mantém seu código pode não estar ciente dessa especificação C # em particular, e perder um bug se ocasionalmente o int se tornar mais do que 2147483647.

Em um for-loop simples que conta, por exemplo, os meses do ano, você não se importa, mas quando você usa a variável em um contexto onde possivelmente poderia fluir, você deve se importar.

Você também deve se preocupar se vai fazer operações bit-wise sobre isso.

0
user11211

Você não deve se importar na maioria das linguagens de programação, a menos que você precise escrever funções matemáticas específicas ou código otimizado para uma arquitetura específica ... Apenas certifique-se que o tamanho do tipo é suficiente para você (use algo maior que um Int se você sabe você precisará de mais de 32 bits por exemplo)

0
Stacker

Usar o tipo Int32 requer uma referência de namespace para System ou totalmente qualificada (System.Int32). Eu tenho tendência para int, porque não requer uma importação de namespace, reduzindo assim a chance de colisão de namespace em alguns casos. Quando compilado para IL, não há diferença entre os dois.

0
Michael Meadows

Não importa. int é a palavra-chave language e Int32 seu tipo de sistema atual.

Veja também my answer here para uma questão relacionada.

0
Keith

Acordo com a janela Immediate no Visual Studio 2012 Int32 é int, Int64 é longo. Aqui está a saída:

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
0
Selim

Considere também Int16. Se você precisar armazenar um Integer na memória em seu aplicativo e estiver preocupado com a quantidade de memória usada, então você pode usar o Int16, pois ele usa menos memeory e tem um intervalo min/max menor que Int32 (que é o que int .)

0
Chris Pietschmann