Por que DateTime.Month é um int?

9

Em C #, a DateTimepropriedade Monthpossui um tipo de int(um número inteiro assinado de 32 bits), mas seu intervalo sempre será de 1 a 12. Quais são as razões pelas quais a equipe do C # escolheu intum tipo numérico menor, como byte(número inteiro não assinado de 8 bits)?

Frayt
fonte
5
A menos que alguém da equipe de projeto C # está à espreita Eu não tenho certeza que você vai ter uma resposta para isso ...
Liath
1
@Liath que não vai ajudar, receio, consulte Está perguntando "por que" as especificações de idiomas ainda consideradas como "baseadas em opiniões primárias" se ele pode ter respostas oficiais? (aliás, uma explicação C desenhador # idioma)
mosquito
Btw, DateTimeconforme implementado no CoreFX, codifica o tempo como um único valor de 64 bits. Informações como dias ou meses são extraídas desse valor por meio de uma matemática inteligente ( GetDatePart()). Esta não é uma razão para usar um int como valor de retorno, apenas não possui desvantagens . Observe também que, devido a problemas de alinhamento, retornar um byte de uma função não será mais eficiente do que retornar um int.
amon
3
Eu ficaria tentado a perguntar por que não é um tipo chamado Month.
bdsl
Provavelmente, é porque as operações executadas internamente exigiam um int, e os designers do compilador decidiram que não vale a pena convertê-lo para outra coisa, provavelmente por razões de desempenho.
NoChance

Respostas:

23

inté usado para quase todas as variáveis ​​inteiras no .NET, embora muitas vezes um tipo menor seja suficiente. Além disso, os tipos não assinados quase nunca são usados, embora possam ser.

Algumas razões:

  1. Tipos assinados e não assinados, bem como tipos inteiros de tamanho diferente podem ser estranhos ao combiná-los ( +ou <por exemplo). As regras não são óbvias. Sou um desenvolvedor experiente e não pude informar o conjunto completo de regras. Eu não preciso saber
  2. inté rápido em todas as arquiteturas comuns. Tipos menores geralmente resultam em conversões que podem ser mais lentas.
  3. O desempenho não é um problema para 99% do código típico. Não há necessidade de pensar demais nisso. Basta usar em intqualquer lugar.
  4. A legibilidade é muito boa porque a intenção é clara. A bytesugeriria dados binários, por exemplo. (Veja o comentário de Flater.)

É uma convenção útil de usar int.

usr
fonte
Obrigado, essas são algumas ótimas razões. Nunca pensei na implicação do desempenho de converter de pequeno para grande ou não assinado em assinado, pois isso está implícito no código.
Frayt 19/09/19
Sim, eu realmente fez código mais lento, uma vez usando bytes em vez de ints, apenas ints de uso; +)
Joel Harkes
1
Outro fator pode ser que "todo mundo realmente prefere int por padrão" e os designers não queriam surpresas de incompatibilidade de tipo.
SD
1
Adicionando a uma resposta completa, a legibilidade é outro motivo para usar int. Se eu visse uma bytepropriedade, não pensaria automaticamente que é um valor numérico. Um byte pode ser muitas coisas (por exemplo, uma coleção compactada de booleanos). Empurrado um pouco mais, duvido que alguém olhe para a byte[]e pense "aha, isso deve ser otimizado List<int>".
Flater
2
O ponto 3 contradiz o ponto 2 nesta resposta. Provavelmente a melhor "ponto 3" seria "Para 99% do código típico, a sobrecarga de memória de 'meses como int' vs 'meses como bytes' não é um problema.
Doc Brown
4

Um mês não é um valor. Um mês é apenas um mês.

O mapeamento 1-12 (que deveria ter sido 0-11 imo) é feito apenas para facilitar a matemática.

E uma vez que você começa a fazer contas com isso, precisa ser pragmático. Ints são o padrão padrão para matemática inteira. Então use esses.

É o que os programadores esperam. Sem contexto: espere um int.

Como você não está interessado se janeiro é 1 (ou 0), você está interessado em respostas a perguntas como: "quantas parcelas mensais até que eu paguei essa dívida". E então você descobre que deveria ter usado o número inteiro em vez do byte.

Pieter B
fonte