ushort ulong type tipo long entre diferencia data c# integer

type - ulong c#



¿Debería usar uint en C#para valores que no pueden ser negativos? (8)

A menudo se usa un valor negativo 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; un valor negativo puede, por lo tanto, 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 tanto, es sensato continuar con esta convención. Si necesita un espacio de índice mayor, puede romper la convención para un mecanismo de señalización de error diferente.

Acabo de intentar implementar una clase en la que numerosas propiedades de longitud / conteo, etc. son uint lugar de int . Sin embargo, al hacerlo noté que en realidad es doloroso hacerlo, como si realmente nadie quisiera hacer eso.

Casi todo lo que entrega un tipo integral devuelve un int , por lo que requiere moldes en varios puntos. Quería construir un StringBuffer con su longitud de búfer predeterminada en uno de los campos de esa clase. Requiere un yeso también.

Entonces me pregunté si debería volver a int aquí. Ciertamente, no estoy usando toda la gama 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 usar uint .

PD: Vi esta pregunta y esto al menos explica por qué el marco en sí mismo siempre usa int pero incluso en el código propio es realmente difícil de mantener, lo que me hace pensar que aparentemente no se quiere realmente.


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 la Especificación del lenguaje común y debe evitarse cuando sea posible.


Mi sensación personal es que probablemente deberías simplemente quedarte con int. No vale la pena agregar un elenco a casi todos los accesos de propiedad solo para reclamar un rango numérico que es poco probable que .NET le permita usar de todos modos.


No nades aguas arriba si no tienes que hacerlo. El hecho de no mezclar su código con moldes hace que su código sea más legible. Además, si sus valores posibles encajan dentro de un int, entonces usar un int no es un problema.

Si tiene miedo de que pueda desbordar un int, entonces hay que hacerlo ... pero no optimice prematuramente.

Yo diría que la legibilidad mejorada de los moldes minimiza el riesgo ligeramente elevado de un error con el uso de int.


OMI, 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 al principio, pero creo que también deberían escribirse para detectar rápidamente errores numéricos sin propagación. En el caso donde un MaxValue de 2 ^ 31 es suficiente, digo use int junto con el uso apropiado de System.Diagnostics.Debug.Assert() y las verificaciones de error correspondientes como se ejemplifica anteriormente.

Si no lo usa, uint junto con checked para evitar subdesbordamientos y obtener los mismos resultados. Sin embargo, he encontrado que el control es un poco difícil de aplicar al código existente que usa moldes para algún propósito.


Si bien estrictamente debe usar uint para las variables que contienen un entero no negativo, ha encontrado una de las razones por las que no siempre es posible.

En este caso, no creo que valga la pena la reducción en la legibilidad que viene con tener que hacer moldes.


Si desea comprobar que un valor es positivo, probablemente una mejor forma sea simplemente usar assert (tenga en cuenta que esta 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);


Usar un int también es útil para detectar el desbordamiento de enteros en las operaciones.