2009-06-26 5 views
2

Gibt es eine Möglichkeit, die delegierte Aufgabe in eine Inline zu integrieren, anstatt sie auf eine andere Funktion zu trennen?Gibt es eine Möglichkeit, eine Funktion an einen Action-Delegaten zu binden und gleichzeitig darauf zu verweisen?

Originalcode:

private void ofdAttachment_FileOk(object sender, CancelEventArgs e) 
    {    
     System.Threading.ThreadPool.QueueUserWorkItem((o) => Attach()); 
    } 

    void Attach() // I want to inline this function on FileOk event 
    { 

     if (this.InvokeRequired) 
     { 
      this.Invoke(new Action(Attach)); 
     } 
     else 
     { 
      // attaching routine here 
     } 
    } 

wollte ich es so (keine Notwendigkeit, eine eigene Funktion erstellen) sein:

private void ofdAttachment_FileOk(object sender, CancelEventArgs e) 
    { 

     Action attach = delegate 
     { 
      if (this.InvokeRequired) 
      { 
       // but it has compilation here 
       // "Use of unassigned local variable 'attach'" 
       this.Invoke(new Action(attach)); 
      } 
      else 
      { 
       // attaching routine here 
      } 
     }; 

     System.Threading.ThreadPool.QueueUserWorkItem((o) => attach()); 
    } 

Antwort

4

Ich denke, das funktioniert:

private void ofdAttachment_FileOk(object sender, CancelEventArgs e) 
{ 

    Action attach = null; 
    attach = delegate 
    { 
     if (this.InvokeRequired) 
     { 
      // since we assigned null, we'll be ok, and the automatic 
      // closure generated by the compiler will make sure the value is here when 
      // we need it. 
      this.Invoke(new Action(attach)); 
     } 
     else 
     { 
      // attaching routine here 
     } 
    }; 

    System.Threading.ThreadPool.QueueUserWorkItem((o) => attach()); 
} 

Sie müssen lediglich einen Wert für "attach" (null works) vor der Zeile, die die anonyme Methode deklariert, zuweisen. Ich denke jedoch, dass ersteres etwas leichter zu verstehen ist.

+0

danke, das funktioniert^_^es ist nur ein wenig verwirrend, warum C# als nicht zugewiesen – Hao

+0

erkannt Zur Laufzeit wird die rechte Seite der Zuordnung vor der linken Seite ausgewertet. Daher sieht der Teil des Compilers, der für diese Warnung verantwortlich ist, wahrscheinlich, dass wir versuchen, den Wert der Variablen innerhalb der rechten Seite des Ausdrucks in der Zeile zu verwenden, der wir ihn zuweisen, also bei der Auswertung der RHS nicht wurde noch nicht zugewiesen. Natürlich, da der Compiler es in eine Schließung herausheben würde, wäre es sowieso ok - ich nehme an, der Compiler weiß nicht, wie er es ändern wird, wenn er die Warnung ausgibt. –

0

Der Grund, warum Sie den Fehler "Verwendung von nicht zugewiesenen Variablen" erhalten, liegt an der Art und Weise, wie der Compiler den Code tatsächlich generiert. Wenn Sie die Syntax delegate {} verwenden, wird vom Compiler eine echte Methode für Sie erstellt. Da Sie auf das angefügte Feld in Ihrem Delegaten verweisen, versucht der Compiler, die lokale Variable attach an die generierte Delegate-Methode zu übergeben.

Hier ist das grob übersetzt Code, der dazu beitragen sollte es klarer:

private void ofdAttachment_FileOk(object sender, CancelEventArgs e) 
{ 

    Action attach = _b<>_1(attach); 

    System.Threading.ThreadPool.QueueUserWorkItem((o) => attach()); 
} 

private Action _b<>_1(Action attach) 
{ 
    if (this.InvokeRequired) 
    { 
     // but it has compilation here 
     // "Use of unassigned local variable 'attach'" 
     this.Invoke(new Action(attach)); 
    } 
    else 
    { 
     // attaching routine here 
    } 
} 

Beachten Sie, dass es vorbei das Feld der <> _1 Methode _b an, bevor es initialisiert wird.