2010-06-29 8 views
6

Ok, also habe ich dieses nette Bit von Code von Microsoft, und ich habe ein kleines Schluckauf, das ich loswerden will.Variable 'x' wird deklariert, aber nie verwendet Fehler

Der ursprüngliche Code gibt die ChangeConflictException x auf der Konsole aus, aber ich löschte diese Zeile. Jedes Mal, wenn ich diesen Code benutze, bekomme ich den Fehler: "Variable 'x' wird deklariert, aber nie benutzt".

Was ist der effizienteste Weg, um diesen Fehler loszuwerden, während die Funktionalität des Codes erhalten bleibt?

//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

Nur um zu verdeutlichen, das ist eine Warnung, kein Fehler, richtig? – Robaticus

+3

@Robaticus - es sei denn, Sie aktivieren Warnungen als Fehler, p –

+0

Oh Snap! Aber ja, ich war falsch, es einen Fehler zu nennen, keine Warnung. – sooprise

Antwort

22

Der Compiler ist richtig; es könnte nur sein, wie auch:

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

die die Ausnahmen beschränkt, die diesen Block eingeben, aber tut nicht für sie eine Variable deklarieren. Die Variable ist nützlich, wenn Sie den Wert prüfen, protokollieren oder in eine andere Ausnahme umbrechen möchten. Nur der Vollständigkeit halber (gilt nicht hier) im Allgemeinen ein Re-Wurf sollte throw;, nichtthrow x; (um die Stack-Trace zu erhalten) sein.

+0

Ok, ich vermutete, du könntest das 'x' entfernen, aber der Code ist zu komplex für mich, um zu sagen, ob es eine signifikante Änderung gemacht hat. Danke! – sooprise

3

In diesem Fall können Sie jedoch einfach die Variable x loswerden (wie von Marc erwähnt). Im Allgemeinen bevorzuge ich für Szenarien, in denen ich diese Warnungen habe und ich den Code nicht ändern kann (wie die Verwendung einiger Felder durch Reflektion), im Allgemeinen einen do not nothing-Aufruf zur bedingten Kompilierungsmethode, der solche lästigen Warnungen unterdrückt.

Code unten.

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){ 

    } 

Referenz von MSDN über Conditional attribute: „Anrufe an ein bedingtes Verfahren entweder enthalten oder weggelassen Abhängigkeit davon, ob dieses Symbol an dem Punkt des Rufs definiert ist, wenn das Symbol definiert ist, wird der Anruf enthält. andernfalls wird der Anruf (einschließlich der Auswertung der Parameter des Anrufs) weggelassen. "

+0

Sie können dies auch tun: 'x = x'. –

+4

@Loadmaster: Bitte erklären Sie der Klasse, wie es eine Verbesserung ist, eine "ungenutzte lokale" Warnung loszuwerden, indem Sie sie durch eine Warnung "local is an sich selbst" ersetzen. –

+0

Ähm, okay, ich dachte nicht, dass der Compiler das verstehen würde. –

1
#pragma warning disable 0168 

catch (ChangeConflictException x) 
{ 
    // code here 
} 

#pragma warning enable 0168 
Verwandte Themen