Devo utilizar os tipos ushort, uint e ulong sempre que o número for ser igual ou maior que 0? – c# .net tipagem

Pergunta:


É uma boa prática ou existe algo da Microsoft recomendando o uso de ushort, uint e ulong sempre que eu tiver certeza que o valor será igual ou maior que 0?

Posso ganhar alguma vantagem utilizando eles ao invés do tradicionais short, int e long? (Além de não ser possível receber um número menor que 0).

Um exemplo seria um método que realizasse a geração de um nome de usuário aleatório, e fosse possível informar o comprimento máximo:

public static string GenerateUsername(int maxLength) {...}

Neste caso eu sempre sei que o comprimento máximo não será menor que 0, então eu deveria utilizar uint ao invés de int?

Minha dúvida surgiu principalmente porque acredito nunca ter visto o uso destes tipos em frameworks, bibliotecas, etc…

Autor da pergunta Vinícius Lima

Maniero

Não, estes tipos existem essencialmente para comunicação de baixo nível com o sistema operacional ou outros serviços que exijam estes tipos.

Todo framework, exceto quando está fazendo o citado anteriormente, é todo projetado para trabalhar com os tipos sinalizados.

Os tipos não sinalizados realmente não podem ter um número negativo armazenado nele, mas nada garante que se atribua um número negativo para ele, o que causará uma perda de dados e não terá o resultado esperado (em contexto unchecked, o C# protege o uso indevido por padrão). Nem pense nestes tipos como números naturais positivos, eles não são isto.

Um nome de usuário com 4 bilhões de caracteres? Espero que não. Um byte é suficiente, e este tipo é sinalizado porque quase sempre quando só quer 1 byte de capacidade, quer ele inteiro. Há quem reclame desta decisão da linguagem.

Se fosse outro exemplo que faz sentido o int permitiria 2 bilhões de tamanho. Quase sempre isto é suficiente, tanto que as coleções do .NET usam um int como length. Se precisa mais que 2 bilhões provavelmente precisa bem mais que 4 bilhões, e aí um long é mais adequado. É muito raro precisar mais que 2 bilhões e menos de 4. Se isto for necessário o long ainda é a melhor solução. A perda de 4 bytes não costuma ser um problema. Se for um problema, aí o uint pode ser usado, mas com muito cuidado e se prepare para ter outros problemas se comunicando com o resto da aplicação que não espera este tipo.

Só porque não permite valor menor que 0 não é motivo para usar uint.

Se usar o uint sozinho não tem tanto problema, o caldo entorna quando começa misturar ele com o tipo sinalizado, as regras de promoção começam ficar complicadas.

Em C é bem mais usado porque é uma linguagem que faz mais coisas de baixo nível. Embora o uso acaba se valendo até mais em tipos de tamanho fixo já que o padrão do C é ter tipos com tamanho dependente da plataforma. Em C# o uso é extramente raro, e quase todos os poucos casos é por causa de interoperabilidade.

Não é o caso de C#, hoje, mas tem linguagens que fazem um uso “esperto” em certas situações do número negativo onde se espera só positivos.

As regras de uma linguagem não são as mesmas de outra, o que complica um pouco mais.

Por incrível que pareça lidar um unsigned costuma ser mais lento nas principais arquiteturas de processadores, assim como short pode ser mais lento que int.

Se bem que hoje economizar memória é mais importante, as pessoas falam bobagem quando acham que memória não é problema hoje em dia. O processador típico hoje tem só 4, 6 ou 8MB, em mobile nem isso, e é uma memória meio lenta, a rápida tem 32 ou 64KB. RAM é um auxílio para armazenar grandes volumes de dados que não cabem no processador, para fazer algo ser rápido o dado deve estar no processador, isto dá muito mais performance que economizar alguns ciclos de processamento puro.

Mas não tente fazer economia sem testar muito bem em vários cenários, e só se precisar muito, e souber de todos os detalhes que podem mudar. Ou seja, é o tipo de otimização que não é para o bico de quase nenhum programador.

Antes de ver o exemplo no Fiddle anote os resultados que espera que este código imprimirá:

var x = 0u;
System.Console.WriteLine(x - 1);

Veja no .NET Fiddle.

Você acertou todos os resultados? tem certeza que sempre acertará todos? Sabe todas as regras? nem eu sei 🙂

Experimente passar umint onde se espera um uint. Tem solução, mas é o ideal ou fica parecendo gambiarra por uma decisão errada antes?

Estes tipos sequer fazem parte da CLS.

Se quer um tipo que garanta só positivos escreva um um que faça isto e que interaja bem com todos os outros tipos numéricos, incluindo aqueles que não parecem ser tão numéricos assim, como DateTime.

Por isto que sempre falo que programação é mais complicado do que parece, e que bom que é assim, não seria divertido se não fosse 🙂 Por sorte algumas pessoas procuram aprender todos os detalhes. Por azar de todos a maioria considera que só aprender o superficial é suficiente.

É ótimo ter o tipo na linguagem para os casos onde ele é necessário, mas não é para usar sem motivo.

Fonte

Related Posts:

Qual a diferença entre AppCompatActivity e Activity? – android android-activity
Pergunta: Qual a diferença da AppCompatActivity para Activity ? A partir de qual versão a AppCompatActivity foi adicionada ao Android? Autor da pergunta Luhhh A diferença reside ...
Como abreviar palavras em PHP? – php string
Pergunta: Possuo informações comuns como nome de pessoas e endereços, e preciso que elas contenham no máximo 30 caracteres sem cortar palavras. Exemplo: 'Avenida Natalino João Brescansin' ...
Qual é a finalidade de um parêntese vazio numa declaração Lambda? – c# expressões-lambda característica-linguagem
Pergunta: Criei um exemplo de uma declaração Lambda sem argumentos, entretanto, estou com duvidas referente a omissão do parêntese vazio () na declaração. Veja o exemplo: class ...
Boas práticas para URI em API RESTful – api rest restful
Pergunta: Estou com dúvida em relação às URIs de alguns recursos da api que estou desenvolvendo. Tenho os recursos projetos e atividades com relação 1-N, ...
Dúvidas sobre a integração do MySQL com Java – java mysql netbeans
Pergunta: Estou criando um sistema no NetBeans, utilizando a linguagem Java e o banco de dados MySQL. Escrevi o seguinte código para realizar a conexão ...
Qual é a finalidade da pasta Model do framework Inphinit? – php inphinit
Pergunta: No Inphinit micro-framework existe a pasta Model que fica dentro da pasta application, e nela é onde ficam as classes, mas eu estou muito ...
Uso do ‘@’ em variáveis – javascript typescript coffeescript
Pergunta: Vejo em algumas linguagens que compilam para javascript, como TypeScript e CoffeeScript, o uso do @ em variáveis, como também, casos em que o ...
Qual tamanho máximo um arquivo JSON pode ter? – json arquivo
Pergunta: Vou dar um exemplo para conseguir explicar minha duvida: Preciso recuperar informação de imagens vindas de uma API, esse banco de imagens me retorna JSON's ...
O que é Teste de Regressão? – terminologia engenharia-de-software testes
Pergunta: Na matéria de Teste de Software o professor abordou um termo chamado Teste de Regressão, isto dentro da disciplina de teste de software. Sendo ...
O que é um construtor da linguagem? – php característica-linguagem
Pergunta: Em PHP, já li e ouvi várias vezes a respeito dos Construtores da Linguagem. Os casos que sempre ouvi falar deles foi em casos ...
Função intrínseca para converter numérico para string – cobol
Pergunta: Estou a tentar saber se existe alguma função intrínseca do COBOL para converter um data numérico para string sem precisar usar a cláusula REDEFINES: ( ...
Porque usar implements? – java android
Pergunta: Qual a diferença entre usar btn.setOnClickListener(new OnClickListener() { e public class MainActivity extends Activity implements OnClickListener{ Estive fazendo um curso de Android e meu professor falou que ...
O que é XHTML e quando deve ser usado? – html xml xhtml
Pergunta: O que eu sei é que o XHTML precisa ser XML válido. Isso implica, por exemplo, que todas as tags precisam ser fechadas. Por ...
Uma placa aceleradora de vídeo pode melhorar o desempenho não-gráfico? [fechada] – desempenho
Pergunta: Para desenvolver em Ruby on Rails, eu utilizo aqui uma máquina virtual do VirtualBox com Ubuntu Server 14.04 sem interface gráfica instalada. Recentemente descobri uma ...
Concat() VS Union() – c# .net
Pergunta: Qual a diferença entre Concat() e Union() ? Quando usar Concat() e quando usar Union() ? Somente pode ser usado em list ? ...

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *