Este post está patrocinado por José María Aguilar, compañero MVP y en campusMVP, y una autoridad en todo lo que es el desarrollo Web. No dejes de visitar su excelente blog: variablenotfound. José María ha donado 90€ para el banco de alimentos en mi iniciativa "¿Te he ayudado? Ayúdame a ayudar a otros". ¡Muchas gracias José María!
¿Y tú, a qué esperas para echar un cable?
El guion bajo, _
,ha sido tradicionalmente un carácter del que se ha abusado mucho a la hora de programar. Se ha usado como convención para varias cosas, sobre todo para "marcar" variables internas, en C# se pueden usar nativamente en el lenguaje para descartar valores, y hasta hay completas bibliotecas de funciones que lo usan como base (vale, esa es la archiconocida de JavaScript, pero también las hay en C#).
Hoy te voy a contar una aplicación del guion bajo en el lenguaje C# que quizá o conozcas: hacer más legibles los números.
Y es que el guion bajo se puede utilizar en cualquier literal numérico para usarlo de separador. Por ejemplo, si en nuestro código queremos definir una constante con un número largo, como por ejemplo esta:
const double numero = 123456789.10;
El número es poco legible. Ese es el motivo por el que en los documentos utilizamos separadores de miles y escribiríamos algo como esto: 123.456.789,10
o incluso (en Español más correcto): 123 456 789,10
.
Pero en un literal de código no podemos hacer eso salvo que lo creemos como una cadena y lo "parseemos", cosa muy poco eficiente y que nos complicaría mucho más.
Así que en C# 7 se introdujo el uso del guion bajo como separador, para poder escribir lo anterior así:
const double numero = 123_456_789.10;
De este modo obtenemos exactamente el mismo número, pero es mucho más legible para un humano, ya que vemos claramente los grupos que estamos separando.
De todos modos hay que saber una cosa importante: esos guiones bajos no tienen significado alguno para el compilador cuando los usamos de esta manera. Es decir, no se consideran separadores de miles ni nada similar: simplemente el compilador hace caso omiso de ellos: como si no existieran.
Por eso, si nos resultase útil por el motivo que sea, podríamos escribir:
const double numero = 1_2_3_4_5_6_7_8_9.1_0;
y sería perfectamente válido.
También los podemos usar con números en otras bases, como hexadecimal o binario:
const int hexadecimal = 0xBC_61_4E; //12345678
const int binario = 0b100_1101_0010; // 1234
const double notCientifica = 3.1_4_15e1_2; //3141500000000
Y funcionarán perfectamente, mejorando de paso la legibilidad (al menos en alguno de los ejemplos que he puesto 😜, pero se pilla la idea).
Puedes usar el guion bajo para mejorar la legibilidad de tus literales numéricos en casi cualquier sitio excepto en:
- Al principio o al final del literal: estos estarían mal:
_123_
, _123
, 123_
y darían un error de variable no definida (al principio) o de sintaxis (al final).
- Justo antes o después del separador decimal: o sea, nada de usarlo así:
3_.1415
, ni así 3._1415
: ni mucho menos así: 3_._1415
. Debido al punto, se podría interpretar como un miembro de alguna clase o estructura, por lo que es ambiguo.
- Justo antes o después de la
e
en notación científica: 1e_10
o 1_e10
están mal.
De esta lista se deduce fácilmente que no es posible utilizarlos justo antes del especificador del tipo (el que va al final para forzar un tipo determinado para el literal) si es que lo usamos: const double numero = 123_d;
, ya que incumple la primer regla de no ir al final del literal numérico.
En fin, que este uso del separador es súpersencillo, pero puede resultar muy interesante para escribir números literales grandes en nuestro código sin que sufra la legibilidad del mismo.
¡Espero que te resulte útil!