Acabo de intentar implementar una clase donde se encuentran numerosas propiedades de longitud / recuento, etc.en uint
lugar de int
. Sin embargo, mientras lo hacía, noté que en realidad es doloroso hacerlo, como si nadie realmente quisiera hacer eso.
Casi todo lo que entrega un tipo integral devuelve un int
, por lo que requiere lances en varios puntos. Quería construir un StringBuffer
con su longitud de búfer predeterminada en uno de los campos de esa clase. También requiere un yeso.
Así que me pregunté si debería volver a int
aquí. Ciertamente no estoy usando todo el rango de todos modos. Simplemente pensé que, dado que lo que estoy tratando allí simplemente no puede ser negativo (si lo fuera, sería un error), sería una buena idea usarlo uint
.
PD: Vi esta pregunta y esto al menos explica por qué el marco en sí siempre se usa, int
pero incluso en el propio código es realmente complicado de cumplir, uint
lo que me hace pensar que aparentemente no es realmente deseado.
Respuestas:
Aunque estrictamente debe usar
uint
para variables que contienen números enteros no negativos, se ha encontrado con una de las razones por las que no siempre es factible.En este caso, no creo que valga la pena la reducción en la legibilidad que conlleva tener que hacer lanzamientos.
fuente
Agregaré a las otras respuestas también que usar uint como tipo de campo público, propiedad, método, parámetro, etc., es una violación de las reglas de Common Language Specification y debe evitarse cuando sea posible.
fuente
Un valor negativo se usa a menudo para señalar una condición de error, y el tamaño de una operación a menudo es devuelto por una llamada de función; por tanto, un valor negativo puede indicar un error sin recurrir a un mecanismo de excepción.
También tenga en cuenta que .NET a menudo se basa en bibliotecas C directas, por lo que es sensato continuar con esta convención. Si necesita un espacio de índice más grande, puede romper la convención para diferentes mecanismos de señalización de errores.
fuente
Mi sentimiento personal es que probablemente debería limitarse a int. No vale la pena agregar una conversión a casi todos los accesos a propiedades solo para recuperar un rango numérico que es poco probable que .NET le permita usar de todos modos.
fuente
El uso de un int también es útil para detectar el desbordamiento de enteros en las operaciones.
fuente
En mi opinión, el inconveniente de usar
uint
es que oculta las condiciones de error. Los equivalentes del siguiente código no son tan agradables:if (len < 0) terminate_program("length attained impossible value.");
Por supuesto, sus programas no deben calcular mal nada para empezar, pero creo que también deben escribirse para detectar rápidamente errores numéricos sin propagación. En el caso de que un MaxValue de 2 ^ 31 sea suficiente, digo uso
int
junto con el uso adecuadoSystem.Diagnostics.Debug.Assert()
y las correspondientes verificaciones de errores como se ejemplificó anteriormente.Si lo usa,
uint
úselo junto conchecked
para evitar el desbordamiento y obtener los mismos resultados. Sin embargo, he descubierto que la verificación es un poco difícil de aplicar al código existente que usa conversiones para algún propósito.fuente
No nade contra la corriente si no es necesario. No escribir su código con casts hace que su código sea más legible. Además, si sus posibles valores encajan dentro de un int, entonces usar un int no es un problema.
Si tiene miedo de desbordar un int, entonces por supuesto ... pero no optimice prematuramente.
Yo diría que la legibilidad mejorada de minimizar los lanzamientos supera el riesgo ligeramente elevado de un error con el uso de int.
fuente
Si desea verificar que un valor sea positivo, probablemente una mejor manera sea simplemente usando assert (tenga en cuenta que esto es solo una técnica de depuración; debe asegurarse de que esto nunca ocurra en el código final).
using System.Diagnostics; ... Debug.Assert (i > 0);
fuente
ArgumentOutOfRangeException
.