tipos tipo son significa que programacion funciones forma float expresar ejemplos datos dato cuál correcta conversion carácter c# .net

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?


  1. No es compatible con CLS, en gran medida para permitir un soporte más amplio desde diferentes idiomas.

  2. Un int firmado ofrece facilidad para portar código desde C o C ++ que usa aritmética de punteros.

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



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.



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?