son - tipos de datos en c# pdf
¿Por qué Count no es un entero sin signo? (5)
Posibles duplicados:
¿Por qué .NET usa int en lugar de uint en ciertas clases?
¿Por qué es Array.Length es un int, no un uint?
Siempre me pregunto por qué .Count
no es un entero sin signo en lugar de uno firmado.
Por ejemplo, tome ListView.SelectedItems.Count
. El número de elementos no puede ser inferior a 0, entonces ¿por qué es un int firmado?
Si intento probar si hay elementos seleccionados, me gustaría probar
if (ListView.SelectedItems.Count == 0) {}
pero como es un entero con signo, tengo que probar
if (ListView.SelectedItems.Count <= 0) {}
o hay algún caso cuando .Count
podría ser <0?
No es compatible con CLS, en gran medida para permitir un soporte más amplio desde diferentes idiomas.
Un int firmado ofrece facilidad para portar código desde C o C ++ que usa aritmética de punteros.
El recuento puede formar parte de una expresión en la que el valor global puede ser negativo. En particular, el conteo tiene una relación directa con los índices, donde los índices válidos están siempre en el rango [0, Recuento - 1], pero los resultados negativos se utilizan, por ejemplo, mediante algunos métodos de búsqueda binarios (incluidos los proporcionados por el BCL) para reflejar la posición donde se debe insertar un nuevo artículo para mantener el orden.
El entero sin signo no es compatible con CLS ( Especificación de lenguaje común )
Para obtener más información sobre el código compatible con CLS, consulte este enlace:
En vb.net, la construcción de bucle normal (un "bucle For / Next") ejecutará el bucle con valores hasta e incluyendo el valor máximo especificado, a diferencia de C, que puede realizar fácilmente bucles con valores por debajo del límite superior. Por lo tanto, a menudo es necesario especificar un bucle como, por ejemplo, "For I = 0 To Array.Length-1"; si Array.Length no estuviera firmado y cero, eso podría causar un problema obvio. Incluso en C, uno se beneficia de poder decir "para (i = Array.Length-1; i GE 0; --i)". A veces creo que sería útil tener un tipo de entero de 31 bits que admita la ampliación de conversiones tanto a int con firma como sin firma, pero nunca he oído hablar de un lenguaje que lo respalde.
Mabye porque el tipo de datos uint no es parte de CLS (especificación de lenguaje común) ya que no todos los lenguajes .Net lo admiten.
Aquí hay un hilo muy similar acerca de las matrices:
Veamos esto desde un ángulo práctico.
Para bien o para mal, los int
firmados son el tipo normal de int
en uso en .NET. También era normal usar int
s firmados en C y C ++. Por lo tanto, la mayoría de las variables se declaran como int
lugar de int
sin signo, a menos que haya una buena razón de lo contrario.
La conversión entre un int
sin signo y un int
firmado tiene problemas y no siempre es segura.
En un sistema de 32 bits, no es posible que una colección tenga cerca de 2 ^^ 32 elementos, por lo que un int
firmado es lo suficientemente grande en todos los casos .
En un sistema de 64 bits, un int
sin firmar no le gana mucho, en la mayoría de los casos, un int
firmado todavía es lo suficientemente grande, de lo contrario debe usar un int
64 bits. (¡Espero que ninguna de las colecciones estándar pueda manejar bien cerca de 2 ^^ 31 elementos en un sistema 64!)
Por lo tanto, dado que usar un int
sin firmar no tiene una ventaja clara, ¿por qué usaría un int
sin firmar?