2016-04-13 5 views
4

Ich möchte mit Anweisung verwenden, aber müssen möglicherweise den Wert der Variablen ändern, die ich "verwende", wenn das Objekt, auf das es zeigen sollte, nicht existiert.Verwenden von Anweisung mit Ändern der verwendeten Variablen

Ich dachte an so etwas wie dieses (für Zugriff auf die Registry und 32/64 Fenster - obwohl dies meine aktuellen Anwendungsfall ist, ist dies eine allgemeine Frage):

using (var key = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(@"SOFTWARE\MS\Platform")) 
{ 
    if (key == null) 
     key = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Wow6432Node\MS\Platform"); 
    // use key 
} 

Above Code nicht kompiliert:

Ich kann dies lösen, indem ich mit nicht verwende, aber versuche/catch/finally, und/oder prüfe, ob der Registrierungsschlüssel existiert, bevor du ihn verwendest.

Gibt es eine Möglichkeit, mit weiter zu verwenden, nachdem das richtige Objekt entsorgt wurde?

Antwort

4

Vielleicht verschmelzen Null?

using (var key = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(@"SOFTWARE\MS\Platform") ?? Microsoft.Win32.Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Wow6432Node\MS\Platform")) 
{ 

    // use key 
} 
+2

Dieser Ausdruck kann ohne Änderung des Verhaltens, das heißt 'var key = ... in eine separate Variable extrahiert werden ?? ...; mit (Schlüssel) {...} '. Wenn der Ausdruck ausgelöst wird, gibt es keinen Schlüssel, der trotzdem entsorgt werden muss. Ausnahmen, die zwischen der Zuweisung und der 'using'-Anweisung geworfen werden, sind ebenso wahrscheinlich wie Ausnahmen, die zwischen der Erzeugung des temporären Objekts und seiner Übereinstimmung mit' Schlüssel 'innerhalb von' using' –

+0

Yes good point geworfen werden. Sie können auch leicht herausfinden, welchen Wert Sie * vor * dem using-Block verwenden wollen und dann einfach die Variable in den using-Code einfügen. – Wjdavis5

3

Nehmen Sie einfach die if aus den using:

var key = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(@"SOFTWARE\MS\Platform"); 
if (key == null) 
     key = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Wow6432Node\MS\Platform"); 

//prob best to null check 
if (key != null) 
{ 
    using (key) 
    { 

     // use key 
    } 
} 

So wie ein FYI und zu erklären, warum Sie dies tun können, ist eine using Aussage nur syntaktischer Zucker für:

readonly IDisposable item; 
try 
{ 

} 
finally 
{ 
    item.Dispose(); 
} 

Weil es als readonly markiert ist, erklärt dies auch, warum yo Sie können es nicht innerhalb der using-Anweisung zuweisen.

+0

Wusste gar nicht, dass das möglich war. –

+0

Eine using-Anweisung ist nur eine Abkürzung zu einem Versuch/endlich/zu entsorgen. Alles, was Sie mit dieser Syntax tun können, können Sie mit einem ... ähm ... using :) tun :) @AndreasReiff – Liam

+0

Seien Sie gewarnt, dass ** das Aktualisieren der Variablen nach dem Einfügen in die Verwendung nicht ändert, was entsorgt wird ** . 'IDisposable Variable; using (Variable = firstDisposable) {Variable = secondDisposable; } 'Das disponiert immer noch' firstDisposable'. Es entsorgt nicht "secondDisposable". – Timo

1

Sobald Sie die Anweisung using betreten, gibt es keine Möglichkeit, das Einweg-Objekt zu ändern es bezieht sich auf:

Innerhalb des mit Block, das Objekt ist schreibgeschützt und kann nicht oder neu zugewiesen modifiziert werden.

https://msdn.microsoft.com/library/yh598w02.aspx

Verwandte Themen