Sufijo C# detrás del literal numérico
Soy nuevo en C# y quiero entender cómo funcionan los valores. Si miro un valor entero normal, tiene 3 partes importantes: el tipo, el nombre y el valor.
int testInt = 3;
| | |
Type Name Value
Pero cuando veo un valor flotante me confunde un poco debido al sufijo F
.
float testFloat = 3.0F;
| | | |
Type Name Value Type
Ahora hay dos tipos en él, y sin el sufijo F
el valor sería un doble. Pero ¿por qué sucede esto cuando puedo declarar la variable doble con
double testDouble = 3.0D;
El double
como la primera palabra debe ser suficiente, ¿no? Lo mismo ocurre con el valor decimal con el sufijo M:
decimal testDecimal = 3.0M;
Entonces empieza a confundirme cuando se trata de los otros sufijos:{[13]]}
ulong bigOne = 2985825802805280508UL;
Usé ulong
en una prueba anterior y sé que el u
es para "sin signo" y permite que el valor sea dos veces más alto que lo normal. Luego obtienes la U de nuevo como sufijo y la L para literal como dijo Google. Como yo lo entiendo, "literales" son tipos de valor que contienen números. Pero lo que no entiendo es, ¿por qué esto ulong trabajar incluso sin el sufijo?
ulong bigOne = 2985825802805280508;
Entonces intenté algo diferente para entender la importancia del sufijo
byte testLong = 12312UL;
Esto no funcionó porque el valor es demasiado alto para byte (254) y el sufijo no lo convierte en una variable larga.
¿Por qué la primera palabra (tipo) no es suficiente para una declaración? La primera palabra debería ser suficiente para decir el tipo. ¿Es la mejor práctica dar siempre un sufijo a los valores?
3 answers
Estás confundiendo dos cosas diferentes aquí: {[13]]}
float testFloat = 3.0F;
El float
le dice al compilador que la variable testFloat
será un valor de coma flotante. El F
le dice al compilador que el literal 3.0
es un float
. El compilador necesita conocer ambas piezas antes de poder decidir si puede asignar el literal a la variable sin conversión o con una conversión implícita.
Por ejemplo, puedes hacer esto:
float testFloat = 3;
Y eso está bien. Porque el el compilador verá 3
como un entero literal, pero sabe que puede asignar eso a un flotador sin pérdida de precisión (esto es conversión implícita). Pero si haces esto:
float testFloat = 3.0;
3.0
es un doble literal (porque es el valor predeterminado sin sufijo) y no puede convertir implícitamente (es decir, automáticamente) un doble a un flotador porque un flotador tiene menos precisión. En otras palabras, la información podría perderse. Así que o le dices al compilador que es un literal flotador:
float testFloat = 3.0f;
O le dices que estás de acuerdo con cualquier pérdida de precisión mediante el uso de un explicit cast:
float testFloat = (float)3.0;
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-06 16:46:09
Todos1 las expresiones deben ser resolubles a un tipo. Así que la expresión 42
siempre necesita tener exactamente un tipo (sucede que es un int
). No puede ser un int
si lo asigna a una variable int
y un double
si lo asigna a un double
. El contexto en el que se usa una expresión nunca es1 se utiliza para determinar a qué tipo se resuelve.
Esta es la razón por la que los literales numéricos pueden tener sufijos; es una forma de definir el tipo de eso expresión en esa expresión.
Tenga en cuenta que también hay conversiones implícitas entre muchos de los tipos numéricos, por lo que si escribe double d = 42;
la expresión 42
es en realidad un entero , pero hay un operador de conversión implícito que se está realizando en él que lo convertirá en un double
antes de la asignación.
1 Hay algunas excepciones aquí, como lambdas, a las que el tipo de la expresión depende de cómo se usa, y el método grupos; en un vacío estas expresiones no tienen tipo.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-06 20:00:13
Existe otra forma de declarar una variable sin especificar el tipo antes del nombre:
var myNumber = 10;
En este caso, el tipo de variable se definirá por el valor literal.
Si utiliza el tipo (double|float|int|...) en lugar de "var", el compilador hace una conversión de valor literal a tipo variable (cuando es posible).
Por lo tanto, creo que el sufijo es importante cuando se usa " var " para declarar variables y el tipo de valor literal no es el asociado predeterminado cuando el sufijo no es usado;
Hay otra razón cuando usar sufijo es demasiado útil, como en la situación en la que desea realizar conversiones implícitas en expresiones.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-06 16:53:13