2010-06-29 27 views
6

Ok, tengo este pequeño código de Microsoft y tengo un pequeño inconveniente del que quiero deshacerme.La variable 'x' está declarada, pero nunca ha sido utilizada. Error

El código original imprime la excepción ChangeConflictException x en la consola, pero borré esta línea. Ahora, cada vez que uso este bit de código, aparece el error: "Variable 'x' se declara pero nunca se usa".

¿Cuál es la forma más eficaz de deshacerse de este error al tiempo que conserva la funcionalidad del código?

//See http://msdn.microsoft.com/en-us/library/bb386918.aspx 
try 
{ 
    DB.SubmitChanges(ConflictMode.ContinueOnConflict); 
} 

catch (ChangeConflictException x) 
{ 
    foreach (ObjectChangeConflict occ in DB.ChangeConflicts) 
    { 
     occ.Resolve(RefreshMode.KeepChanges); 
    } 
} 
// Submit succeeds on second try. 
DB.SubmitChanges(ConflictMode.FailOnFirstConflict); 
+5

Solo para aclarar, esto es una advertencia, no es un error, ¿correcto? – Robaticus

+3

@Robaticus - a menos que habilite las advertencias como errores; p –

+0

¡Oh chasquido! Pero sí, era incorrecto llamarlo un error, no una advertencia. – sooprise

Respuesta

22

El compilador tiene razón; sólo así podría ser:

catch (ChangeConflictException) 
{ 
    foreach (ObjectChangeConflict occ in DB.ChangeConflicts) 
    { 
     occ.Resolve(RefreshMode.KeepChanges); 
    } 
} 

que limita las excepciones que entran en ese bloque, pero no lo hace declarar una variable para ello. La variable es útil si desea inspeccionar el valor, registrarlo o ajustarlo en otra excepción. Solo para completar (no se aplica aquí) generalmente un re-lanzamiento debe ser throw;, nothrow x; (para preservar el seguimiento de la pila).

+0

Ok, sospechaba que podías eliminar la 'x', pero el código es demasiado complejo para que yo diga si hubo algún cambio significativo. Gracias! – sooprise

3

Aunque en este caso simplemente puede deshacerse de la variable 'x' (como lo menciona Marc). En general, para los escenarios donde tengo estas advertencias y no puedo cambiar el código (como usar algunos campos por reflexión) generalmente prefiero hacer una llamada de no hacer al método de compilación condicional que suprime tales advertencias molestas.

Codifique a continuación.

catch (ChangeConflictException x) 
    { 
    DoNothingWith(x);// This suppress the 'x' not used warning 
    foreach (ObjectChangeConflict occ in DB.ChangeConflicts) 
    { 
     occ.Resolve(RefreshMode.KeepChanges); 
    } 
    } 

    [Conditional("Debug")] 
    public static void DoNothingWith(object obj){ 

    } 

de referencia de MSDN sobre el atributo condicional: "llamadas a un método condicional pueden estar incluidos o se omite en función de si este símbolo se define en el punto de la llamada Si se define el símbolo, se incluye la llamada. ; de lo contrario, la llamada (incluida la evaluación de los parámetros de la llamada) se omite ".

+0

También podría hacer esto: 'x = x'. –

+4

@Loadmaster: explique a la clase cómo deshacerse de una advertencia de "estado no utilizado" reemplazándola con una advertencia de "local asignado a sí mismo" es una mejora. –

+0

Um, está bien, no pensé que el compilador captaría eso. –

1
#pragma warning disable 0168 

catch (ChangeConflictException x) 
{ 
    // code here 
} 

#pragma warning enable 0168 
Cuestiones relacionadas