Pregunta

Esta pregunta ya tiene respuesta aquí:

Por que es Array.Length un int, y no un uint.Esto me molesta (sólo un poco) porque un valor de longitud nunca puede ser negativo.

Esto también me obligó a usar un int para una propiedad de longitud en mi propia clase, porque cuando especificas un valor int, esto debe ser elegido explícitamente ...

Entonces la pregunta final es:¿Hay algún uso para un int sin firmar (uint)?Incluso Microsoft parece no utilizarlos.

¿Fue útil?

Solución

Unsigned int no es compatible con CLS y, por lo tanto, restringiría el uso de la propiedad a aquellos idiomas que implementan un UInt.

Mira aquí:

Marco 1.1

Introducción a la biblioteca de clases de .NET Framework

Marco 2.0

Descripción general de la biblioteca de clases de .NET Framework

Otros consejos

Muchas razones:

  • uint no es compatible con CLS, por lo que hacer que un tipo integrado (matriz) dependa de él habría sido problemático
  • El tiempo de ejecución tal como se diseñó originalmente prohíbe cualquier objeto en el montón que ocupe más de 2 GB de memoria.Dado que la matriz de tamaño máximo que sería menor o igual a este límite sería un nuevo byte [int.MaxValue], sería desconcertante para las personas poder generar longitudes de matriz positivas pero ilegales.
  • Históricamente, C# hereda gran parte de su sintaxis y convenciones de C y C++.En esas matrices hay simplemente aritmética de punteros, por lo que era posible la indexación de matrices negativas (aunque normalmente es ilegal y peligrosa).Dado que gran parte del código existente supone que el índice de la matriz está firmado, esto habría sido un factor
  • En una nota relacionada, el uso de enteros con signo para índices de matrices en C/C++ significa que la interoperabilidad con estos lenguajes y funciones no administradas requeriría el uso de ints en esas circunstancias de todos modos, lo que puede confundir debido a la inconsistencia.
  • La implementación de BinarySearch (un componente muy útil de muchos algoritmos) se basa en poder usar el rango negativo de int para indicar que no se encontró el valor. y la ubicación en la que se debe insertar dicho valor para mantener la clasificación.
  • Al operar en una matriz, es probable que desee realizar un desplazamiento negativo de un índice existente.Si usó un desplazamiento que lo llevaría más allá del inicio de la matriz usando la unidad, entonces el comportamiento envolvente haría que su índice posiblemente sea legal (en el sentido de que es positivo).Con un int el resultado sería ilegal (pero seguro ya que el tiempo de ejecución protegería contra la lectura de memoria no válida)

Creo que también podría tener que ver con simplificar las cosas en un nivel inferior, ya que Array.Length, por supuesto, se agregará a un número negativo en algún momento, si Array.Length no estuviera firmado y se agregara a un int negativo (complemento a dos). , podría haber resultados complicados.

Parece que nadie respondió a "la pregunta fundamental".

Creo que el uso principal de entradas sin firmar es proporcionar una interfaz más sencilla con sistemas externos (P/Invoke y similares) y cubrir las necesidades de varios lenguajes que se trasladan a .NET.

Normalmente, los valores enteros están con signo, a menos que necesite explícitamente un valor sin signo.Es simplemente la forma en que se usan.Puede que no esté de acuerdo con esa elección, pero así son las cosas.

Por el momento, con las limitaciones de memoria típicas de hoy en día, si su matriz o estructura de datos similar necesita una longitud UInt32, debe considerar otras estructuras de datos.

Con una matriz de bytes, Int32 le dará 2 GB de valores

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top