2010-12-22 7 views
4

Während eine .NET Reflector für eine App um einige Code Stossen mit ich nicht den Quellcode haben, fand ich diese:Was ist der Zweck dieser Delegatennutzung?

if (DeleteDisks) 
{ 
    using (List<XenRef<VDI>>.Enumerator enumerator3 = list.GetEnumerator()) 
    { 
    MethodInvoker invoker2 = null; 
    XenRef<VDI> vdiRef; 
    while (enumerator3.MoveNext()) 
    { 
     vdiRef = enumerator3.Current; 
     if (invoker2 == null) 
     { 
     // 
     // Why do this? 
     // 
     invoker2 = delegate { 
      VDI.destroy(session, vdiRef.opaque_ref); 
     }; 
     } 
     bestEffort(ref caught, invoker2); 
    } 
    } 
} 
if (caught != null) 
{ 
    throw caught; 
} 


private static void bestEffort(ref Exception caught, MethodInvoker func) 
{ 
    try 
    { 
    func(); 
    } 
    catch (Exception exception) 
    { 
    log.Error(exception, exception); 
    if (caught == null) 
    { 
     caught = exception; 
    } 
    } 
} 

Warum nicht direkt VDI.destroy() nennen? Ist das nur ein Weg, das gleiche Muster von try { do something } catch { log error } zu wickeln, wenn es viel benutzt wird?

Antwort

5

Der Grund scheint zu sein, eine einzige Funktion zum Behandeln und Protokollieren von Fehlern in Operationen zu haben, die fehlschlagen können: bestEffort. Der Delegat wird verwendet, um die fehlgeschlagene Aktion zu umbrechen und an die bestEffort-Funktion zu übergeben.

+0

Ja, das ist, was ich dachte. Vielen Dank. – Kev

1

Ein Delegat kann als Argument an eine andere Funktion übergeben werden. Die akzeptierende Funktion muss dann nicht wissen, wo diese Funktion ist, welche Klasse sie exponiert. Es kann es aufrufen und die Ergebnisse konsumieren wie von einer normalen Methode. Die Lambdas und dann die Ausdrucksbäume sind um die Delegierten herum aufgebaut. Normale Funktionen können zur Laufzeit nicht ausgewertet werden, was beim Erstellen einer Ausdrucksbaumstruktur mit einem Delegaten möglich ist. Sie haben Ihre spezifische Frage bereits beantwortet. Also werde ich einfach die allgemeine Idee zu der Frage hinzufügen.

+0

Danke für die Antwort, ich weiß alles über Delegierte und Lambdas und all die guten Sachen, nur nie auf diese Art der Nutzung stoßen. – Kev

+0

Ok, sorry, dein Stack-Overflow-Level sollte mir das vor meinem Post gesagt haben :) – dexter