¿Por qué Array.Length es una int, y no es un uint

¿Por qué Array.Length es una int, y no un uint ? Esto me molesta (solo 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 especifica un valor int, esto debe emitirse explícitamente …

Entonces la pregunta final es: ¿hay algún uso para unsigned int ( uint )? Incluso Microsoft parece no usarlos.

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

Mira aquí:

Marco 1.1

Introducción a .NET Framework Class Library

Framework 2.0

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

Muchas razones:

  • uint no es compatible con CLS, por lo que crear un tipo incorporado (matriz) depende de ello hubiera sido problemático
  • El tiempo de ejecución como se diseñó originalmente prohíbe que cualquier objeto en el montón ocupe más de 2 GB de memoria. Como la matriz de tamaño máximo que sería inferior o igual a este límite sería un byte nuevo [int.MaxValue], sería desconcertante para las personas poder generar longitudes de matriz positivas pero ilegales.
    • Tenga en cuenta que esta limitación se ha eliminado en cierta medida en la versión 4.5 , aunque la longitud estándar como int permanece.
  • Históricamente C # hereda gran parte de su syntax y convención de C y C ++. En esas matrices, simplemente se trata de una aritmética de punteros, por lo que era posible indexar matrices negativas (aunque normalmente son ilegales y peligrosas). Dado que gran parte del código existente supone que el índice de matriz está firmado, esto habría sido un factor
  • En una nota relacionada, el uso de enteros con signo para índices de matriz en C / C ++ significa que la interoperabilidad con estos idiomas y funciones no administradas requeriría el uso de enter 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 ordenación.
  • Cuando se opera en una matriz, es probable que desee tomar una compensación negativa de un índice existente. Si utilizó un desplazamiento que lo llevaría más allá del inicio de la matriz con la unidad, entonces el comportamiento de ajuste haría que su índice fuera 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 evitaría leer la memoria no válida)

Creo que también podría tener que ver con la simplificación de 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 agregado a un int negativo (complemento de dos) , podría haber resultados desordenados

Parece que nadie brindó respuesta a “la última pregunta”.

Creo que el uso principal de ints sin firmar es facilitar la interacción con sistemas externos (P / Invoke y similares) y cubrir las necesidades de varios idiomas que se transfieren a .NET.

Normalmente, los valores enteros están firmados, a menos que necesite explícitamente un valor sin signo. Es solo 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 restricciones de memoria típicas de hoy, 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