En este caso, el compilador detecta que s está escrito, pero no leer, y suprime deliberadamente la advertencia
La razón se debe a que C# es un lenguaje de recolección de basura. , lo creas o no.
¿Cómo darse cuenta de eso?
Bueno, tenga en cuenta lo siguiente.
Tiene un programa que llama a un método DoIt() que devuelve una cadena. No tiene el código fuente para DoIt(), pero desea examinar en el depurador cuál es su valor de retorno.
Ahora en su caso particular está utilizando DoIt() por sus efectos secundarios, no por su valor de retorno. Así que decir
DoIt(); // discard the return value
Ahora que va a depurar su programa y que vaya a mirar el valor de retorno de DoIt() y no está ahí porque por el momento se rompe el depurador después de la llamada a DoIt(), el recolector de basura ya pudo haber limpiado la cadena no utilizada.
Y, de hecho, el depurador gestionado no tiene ninguna función para "ver lo devuelto por la llamada al método anterior". El depurador de C++ no administrado tiene esa característica porque puede mirar el registro EAX donde el valor de retorno descartado todavía está activo, pero no tiene garantía en el código administrado de que el valor devuelto esté vivo si fue descartado.
Ahora, uno podría argumentar que esta es una característica útil y que el equipo del depurador debería agregar una característica por la cual los valores devueltos se mantienen vivos si hay un punto de interrupción del depurador inmediatamente después de la ejecución de un método. Esa sería una buena característica, pero soy la persona equivocada para pedirla; ve a preguntar al equipo de depuración.
¿Qué debe hacer el desarrollador de pobres C#? Cree una variable local, almacene el resultado en la variable local y luego examine el local en el depurador. El depurador does asegura que los locales no sean recolectados de manera agresiva.
Así que hazlo y luego el compilador te advierte que tienes un local que solo está escrito y nunca lee porque lo que hace la lectura no es parte del programa, es el desarrollador sentado allí viendo el depurador. ¡Esa es una experiencia de usuario muy irritante! Por lo tanto, detectamos la situación en la que un valor no constante se está asignando a una variable local o campo que nunca es lea, y suprima esa advertencia. Si cambia su código para que en su lugar diga string s = "hello";
, comenzará a recibir la advertencia porque el compilador razona, bueno, esto no puede ser alguien que esté trabajando alrededor de las limitaciones del depurador porque el valor es allí donde el desarrollador ya puede leerlo sin el depurador.
Eso lo explica. Existen numerosos otros casos en los que suprimimos advertencias sobre variables que nunca se leen; un detailed exegisis of all the compiler's policies para cuando reportemos advertencias y cuando no nos tome bastante tiempo para escribir, así que creo que lo dejaré así.
Consejo: Utilice el 'catch (Exception)' en lugar. Si desea ver la excepción en el depurador, use '$ exception'. – Brian