2010-09-07 17 views
43

duplicados posibles:
Why does .NET use int instead of uint in certain classes?
Why is Array.Length an int, and not an uint¿Por qué Count no es un entero sin signo?

siempre he preguntan por qué .Count no es un entero sin signo en lugar de una firma?

Por ejemplo, tome ListView.SelectedItems.Count. La cantidad de elementos no puede ser menor que 0, entonces ¿por qué es un int firmado?

Si intento para probar si hay elementos seleccionados, me gustaría probar

if (ListView.SelectedItems.Count == 0) {} 

sino porque es un entero con signo, tengo que probar

if (ListView.SelectedItems.Count <= 0) {} 

o hay cualquier caso cuando .Count podría ser < 0?

+4

Supongo que es por conveniencia, porque no se puede enviar un mensaje a un int y la mayoría de la gente está acostumbrada a usar ints para indexadores ... –

+3

aún así puedes probar '== 0', ¿verdad? ya que, como usted señala, nunca será menor que 0. después de todo, no hay escapatoria de que, en algún punto, su código asumirá que el código de otras personas se comportará de la manera que los nombres de los miembros implican. Yo diría que le otorga la capacidad de asumir 'Count' nunca será menor que 0, y comprobar la igualdad. –

+0

Y el duplicado de [¿Por qué Array.Length es una int, y no es una uint] (http://stackoverflow.com/questions/6301), [¿Por qué las variables sin signo se utilizan con más frecuencia?] (Http: // stackoverflow .com/questions/490222) –

Respuesta

51

número entero sin signo no es compatible con CLS (Common Language Specification)

Para obtener más información sobre CLS compatible con el código, ver este enlace:

http://msdn.microsoft.com/en-us/library/bhc3fa7f.aspx

+10

Aunque esto responde a la pregunta de la carta, no explica. Tal vez la pregunta debería haber sido, "¿por qué * no es CLS obediente?" Esa fue de hecho una decisión extraña. –

+13

La pregunta de por qué uint no es compatible con CLS es un tema para una pregunta separada, que ya se ha preguntado aquí: http://stackoverflow.com/questions/6325/why-are-unsigned-ints-not-cls-compliant –

4

mabye porque el tipo de datos uint no es parte de la CLS (especificación de lenguaje común), ya que no todos los lenguajes .Net lo admiten.

Aquí es hilo muy similar acerca de las matrices:

Why is Array.Length an int, and not an uint

5

Veamos esto desde un punto de vista práctico.

Para mejor o peor, firmaron int s son los normales tipo de int s en uso en .NET. También era normal usar firmado int s en C y C++. Por lo tanto, la mayoría de las variables se declaran como int en lugar de int sin signo a menos que haya una buena razón de lo contrario.

La conversión entre un int sin firmar y un int firmado tiene problemas y no siempre es seguro.

En un sistema de 32 bits no es posible para una colección que tiene en cualquier lugar cerca de 2 ^^ 32 artículos en el mismo, por lo que un firmado int es lo suficientemente grande como en todos los casos.

En un sistema de 64 bits, sin signo int no te ganancia mucho, en la mayoría de los casos una firmaron int es todavía lo suficientemente grandes, pues es necesario utilizar un poco int 64. (¡Espero que ninguna de la colección estándar se adapte bien a cerca de 2 ^^ 31 elementos en un sistema 64!)

Por lo tanto, dado que el uso de un int sin signo no tiene una clara ventaja, ¿por qué usaría un int sin signo?

+0

Veo una clara ventaja: cuando alguien comete un error, por ejemplo '(Names.Count <0)' (en lugar de '(Names.Count> 0)') el compilador puede advertir. Creo que advertir a los usuarios que cometen errores es una tarea muy importante del compilador, y cualquier lenguaje que haga que sea más fácil detectar errores tiene una ventaja sobre los competidores. De hecho, es por eso que prefiero los lenguajes compilados en primer lugar. – Johan

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

  2. Un int firmado ofrece facilidad en el código de portación de C o C++ que utiliza la aritmética del puntero.

  3. El recuento puede ser parte de una expresión donde el valor total puede ser negativo. En particular, count tiene una relación directa con los índices, donde los índices válidos siempre están en el rango [0, Count - 1], pero los resultados negativos se usan, por ejemplo. mediante algunos métodos de búsqueda binarios (incluidos los que proporciona el BCL) para reflejar la posición en la que se debe insertar un nuevo artículo para mantener el orden.

0

En vb.net, el constructo de bucle normal (A "para/bucle Siguiente") ejecutará el bucle con valores de hasta e incluyendo el valor máximo especificado, a diferencia de C, que puede fácilmente bucle con valores por debajo del limite superior. Por lo tanto, a menudo es necesario especificar un bucle como, por ejemplo, "Para I = 0 a Array.Length-1"; si Array.Length no tiene firma y es cero, eso podría causar un problema obvio. Incluso en C, uno se beneficia de poder decir "for (i = Array.Length-1; i GE 0; - i)". A veces creo que sería útil tener un tipo de entero de 31 bits que admitiría la ampliación de los lanzamientos tanto para la sesión como para la sesión sin firmar, pero nunca he oído hablar de un lenguaje que los respalde.

+0

¡¡Exactamente !! VB es diferente: en VB, el término verdadero es 0 y el término falso es -1. Con este axioma, -1 es un int y no se puede decir con unsigned int. Es claramente un problema de optimización de la CPU – user1587368

+0

¡¡Exactamente !! VB es diferente: en VB, el término verdadero es 0 y el término falso es -1. Con este axioma, -1 es un int y no se puede decir con unsigned int. Creo que la razón de usar una versión firmada de un entero, en lugar de una int sin firmar, es claramente un problema de optimización de la CPU: un número con cero tiene un valor negativo -1. Por ejemplo, una puerta NOT en un esquema lógico es eficiente sobre cómo decir que un valor es igual a cero o está vacío. – user1587368

+0

@ user1587368: Una ventaja de (two's-complement) signed int es que dichos tipos tienen -1 como el valor de "todos los conjuntos de bits", independientemente del tamaño, mientras que cada tamaño de tipo sin signo tiene un "todo-bits-" diferente valor ajustado. – supercat

Cuestiones relacionadas