Aunque antes se han dado una
serie de restricciones sobre cuáles son los nombres válidos que se pueden dar
en C# a los identificadores, falta todavía por dar una: los siguientes nombres
no son válidos como identificadores ya que tienen un significado especial en el
lenguaje:
abstract, as, base, bool, break,
byte, case, catch, char, checked, class, const, continue, decimal, default, delegate, do, double, else, enum,
event, explicit, extern, false, finally,
fixed, float, for, foreach, goto, if, implicit, in, int, interface, internal,
lock, is, long, namespace, new,
null, object, operator, out, override, params, private, protected, public, readonly, ref, return, sbyte, sealed, short,
sizeof, stackalloc, static, string,
struct, switch, this, throw, true, try, typeof, uint, ulong, unchecked, unsafe,
ushort, using, virtual, void, while
Aparte de estas palabras
reservadas, si en futuras implementaciones del lenguaje se decidiese incluir
nuevas palabras reservadas, Microsoft dice que dichas palabras habrían de
incluir al menos dos símbolos de subrayado consecutivos (__) Por tanto, para evitar posibles conflictos
futuros no se recomienda dar a nuestros identificadores nombres que contengan
dicha secuencia de símbolos.
Aunque directamente no podemos
dar estos nombres a nuestros identificadores, C# proporciona un mecanismo para
hacerlo indirectamente y de una forma mucho más legible que usando secuencias
de escape. Este mecanismo consiste en usar el carácter @ para prefijar el nombre coincidente con el
de una palabra reservada que queramos dar a nuestra variable. Por ejemplo, el
siguiente código es válido:
class @class
{
static void @static(bool @bool)
{
if (@bool)
Console.WriteLine("cierto");
else
Console.WriteLine("falso");
}
}
Lo que se ha hecho en el código
anterior ha sido usar @ para declarar una clase de nombre class con un método de nombre static que toma un
parámetro de nombre bool, aún
cuando todos estos nombres son palabras reservadas en C#.
Hay que precisar que aunque el nombre que nosotros escribamos sea por
ejemplo @class, el nombre con el
que el compilador va a tratar internamente al identificador es solamente class. De hecho, si desde código escrito en otro
lenguaje adaptado a .NET distinto a C# hacemos referencia a éste identificador
y en ese lenguaje su nombre no es una palabra reservada, el nombre con el que
deberemos referenciarlo es class, y no @class
(si también fuese en ese lenguaje palabra reservada habría que
referenciarlo con el mecanismo que el lenguaje incluyese para ello, que quizás
también podría consistir en usar @
como en C#)
En realidad, el uso de @ no se tiene porqué limitar a preceder palabras reservadas en C#, sino que podemos preceder cualquier nombre con él. Sin
embargo, hacer esto no se recomienda, pues es considerado como un mal hábito de
programación y puede provocar errores muy sutiles como el que muestra el
siguiente ejemplo:
class A
{
int
a; // (1)
int
@a; // (2)
public
static void Main()
{}
}
Si intentamos compilar este
código se producirá un error que nos informará de que el campo de nombre a ha sido declarado múltiples veces en la clase A. Esto se debe a que como @
no forma parte en realidad del nombre del identificador al que precede, las
declaraciones marcadas con comentarios como (1) y (2) son equivalentes.
Hay que señalar por último una
cosa respecto al carácter @: sólo puede
preceder al nombre de un identificador,
pero no puede estar contenido dentro del mismo. Es decir,
identificadores como i5322@fie.us.es
no son válidos.