Para entenderlo, necesitamos introducir dos nuevos operadores. El objetivo principal de estos operadores es hacer más fluida la ejecución del código y reemplazar la NullReferenceExeption con un significativo manejo de errores.
- ?. -Llamado operador de acceso de miembros
- ?[] ——-; Llamado operador de acceso al elemento
Veamos un ejemplo del operador de acceso de miembros. Antes de C#, el siguiente código habría resultado en System.NullReferenceException: «Referencia de objeto no establecida en una instancia de un objeto».
1234567891011121314151617 usando el sistema;namespace {publicclassNullProp{publicstaticvoidMain(){Server DC =newServer(); Console.WriteLine(DC.name.Length); Console.ReadKey();}classServer{publicstring name {get;set;}}}
csharp
El problema aquí es que nos gustaría comprobar la longitud de una propiedad que nunca fue inicializada, y esto lanza la excepción.
Una forma de manejar esto es con la siguiente modificación del código. Nos gustaría envolver el código crítico en un bloque de prueba y captura buscando referencias nulas.
1234try{ Consola.WriteLine(DC.nombre.longitud);}}catch(System.NullReferenceException){ Consola.WriteLine("El nombre no está inicializado.");}
csharp
Esto nos da el siguiente resultado.
1El nombre no está inicializado.
bash
Esto parece funcionar, sin embargo, tenemos que modificar el código de la siguiente manera.
1Console.WriteLine(DC?.name ?? "No Name provided yet!");
csharp
Si no inicializamos la propiedad del nombre de antemano, obtenemos la siguiente salida.
1No se ha proporcionado ningún nombre todavía!
bash
Esto nos ahorra el bloqueo de la captura y reduce la longitud del código. El operador ?? se llama el operador de coalescencia nula , que nos permite escribir expresiones condicionales que devuelven un valor por defecto cuando la expresión evalúa a nulo. El operador ?? puede utilizarse para invocar a un delegado de forma segura en los hilos, lo que ayuda al desarrollo de aplicaciones multihilo.
Nota: El apodo de este operador es el operador Elvis.
Veamos un ejemplo para el operador de acceso al elemento. Nos gustaría modificar el código anterior de la siguiente manera.
123456789101112131415161718192021222324252627282930313233 que utiliza el sistema;namespace {publicclassNullProp{publicstaticvoidMain(){ Server[] servers =newServer[5];Server S1 =newServer(); S1.name ="First";Server S2 =newServer(); S2. nombre ="Segundo";Servidor S3 =nuevoServidor();Servidor S4 =nuevoServidor(); S4.nombre ="Primero";Servidor S5 =nuevoServidor(); servidores[0]= S1; servidores[1]= S2; servidores[2]= S3; servidores[3]= S4; servidores[4]= S5;foreach(Servidores en servidores){ Consola.WriteLine(s?.nombre ?? "¡No se especifica el nombre!");} Console.ReadKey();}classServer{nombre de la cadena pública {get;set;}}}
csharp
Necesitamos un conjunto de cinco elementos. Este arreglo estará lleno de servidores, y algunos servidores tendrán sus propiedades de nombre inicializadas. Luego iteramos sobre los servidores y comprobamos con el operador de acceso de miembros si los nombres de los servidores están inicializados. Bien, ahora se preguntarán dónde está la demostración del operador de acceso de elementos. El bucle for puede ser fácilmente convertido a este tipo.
1234for(int i =0; i <5; i++){ Console.WriteLine(servers?[i].name ?? "No se especificó ningún nombre!");}
csharp
Incluso podemos combinar el elemento y los operadores de acceso a los miembros de esta manera.
1234for(int i =0; i <5; i++){ Console.WriteLine(servers?[i]?.name ?? "No se especificó ningún nombre!");}
csharp
La siguiente salida se produce cuando ejecutamos el código.
123456789101112# primero para el loopFirstSecondNo se especificó el nombre!bash