Pergunta

Essa pergunta já tem resposta aqui:

Por que é Array.Length um int, e não um uint.Isso me incomoda (só um pouco) porque um valor de comprimento nunca pode ser negativo.

Isso também me forçou a usar um INT para uma propriedade de comprimento em minha própria aula, porque quando você especifica um valor int, isso precisa ser lançado explicitamente ...

Portanto, a questão final é:existe alguma utilidade para um int não assinado (uint)?Até a Microsoft parece não usá-los.

Foi útil?

Solução

Unsigned int não é compatível com CLS e, portanto, restringiria o uso da propriedade às linguagens que implementam um UInt.

Veja aqui:

Estrutura 1.1

Introdução à biblioteca de classes do .NET Framework

Estrutura 2.0

Visão geral da biblioteca de classes do .NET Framework

Outras dicas

Muitas razões:

  • uint não é compatível com CLS, portanto, tornar um tipo integrado (matriz) dependente dele teria sido problemático
  • O tempo de execução originalmente projetado proíbe qualquer objeto no heap que ocupe mais de 2 GB de memória.Como o array de tamanho máximo que seria menor ou igual a esse limite seria new byte[int.MaxValue] seria intrigante para as pessoas ser capaz de gerar comprimentos de array positivos, mas ilegais.
  • Historicamente, o C# herda grande parte de sua sintaxe e convenção de C e C++.Nessas matrizes são simplesmente aritmética de ponteiros, portanto a indexação negativa de matrizes era possível (embora normalmente ilegal e perigosa).Como grande parte do código existente assume que o índice da matriz está assinado, isso teria sido um fator
  • Por outro lado, o uso de inteiros assinados para índices de array em C/C++ significa que a interoperabilidade com essas linguagens e funções não gerenciadas exigiria o uso de inteiros nessas circunstâncias de qualquer maneira, o que pode confundir devido à inconsistência.
  • A implementação do BinarySearch (um componente muito útil de muitos algoritmos) depende da capacidade de usar o intervalo negativo do int para indicar que o valor não foi encontrado e o local no qual tal valor deve ser inserido para manter a classificação.
  • Ao operar em uma matriz, é provável que você queira obter um deslocamento negativo de um índice existente.Se você usasse um deslocamento que o levaria além do início da matriz usando a unidade, o comportamento envolvente tornaria seu índice possivelmente legal (porque é positivo).Com um int o resultado seria ilegal (mas seguro, pois o tempo de execução protegeria contra a leitura de memória inválida)

Acho que também pode ter a ver com simplificar as coisas em um nível inferior, já que Array.Length será obviamente adicionado a um número negativo em algum momento, se Array.Length não tiver sinal e for adicionado a um int negativo (complemento de dois) , pode haver resultados confusos.

Parece que ninguém respondeu à "pergunta final".

Acredito que o uso principal de unsigned ints é fornecer uma interface mais fácil com sistemas externos (P/Invoke e similares) e cobrir as necessidades de várias linguagens sendo portadas para .NET.

Normalmente, os valores inteiros são assinados, a menos que você precise explicitamente de um valor não assinado.É apenas a maneira como eles são usados.Posso não concordar com essa escolha, mas é assim que as coisas são.

Por enquanto, com as restrições de memória típicas de hoje, se seu array ou estrutura de dados semelhante precisar de um comprimento UInt32, você deverá considerar outras estruturas de dados.

Com uma matriz de bytes, o Int32 fornecerá 2 GB de valores

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top