objects multidimensional length know how example array c# .net int uint

c# - multidimensional - ¿Por qué Array.Length es una int, y no es un uint



how to know length of array in c# (5)

Esta pregunta ya tiene una respuesta aquí:

¿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.


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


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.
  • Históricamente C # hereda gran parte de su sintaxis 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)

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


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.