使用委托

问题描述:

我读了一些基本的使用委托here使用委托

上我贴在SO一个问题,下面的代码是答案的一部分。

此语法是否可以转换为语法,更类似于MSDN文章,其中明确声明了委托等等,或者在某些情况下,这是编码它的唯一方法吗?

我要找的编码它的另一种方式的原因是,作为一个新手到C#我找到这一行很难让我的头周围this.BeginInvoke(new MethodInvoker(delegate

private void myTimer_Elapsed(Object myObject,EventArgs myEventArgs){ 

     elapsedCounter++; 
     elapsedTime = DateTime.Now.Subtract(startTime); 

     if (elapsedTime.TotalMilliseconds < MaxTime) 
     { 
      this.BeginInvoke(new MethodInvoker(delegate 
      { 
       this.lblElapsedTime.Text = elapsedTime.ToString(); 

       if (elapsedCounter % 2 == 0) 
        this.lblValue.Text = EvenText; 
       else 
        this.lblValue.Text = OddText; 
      })); 
     } 
     else 
     { 
      myTimer.Stop(); 
      myTimer.Dispose(); 
      //myProcess.Close(); 
     } 
    } 
+2

的是..这不* *明确声明一个代理...?你在寻找什么样的替代语法? –

+0

woops! +1为你的外交Marc。 MSDN文章中的语法似乎更加明确,便于我掌握正在发生的事情。我认为'this.BeginInvoke(新的MethodInvoker(委托)做了很多,所以我希望替代方案将它分解成更多的代码行,这样我就可以看到它正在发生。 – whytheq

MethodInvoker只是一个预定义的委托这需要没有任何参数和返回void

public delegate void MethodInvoker() 

你是完全免费的,而不是创建自己的代表,就像在例子中,你链接到:

private delegate void MyDelegate(); 

并且用MyDelegate替换MethodInvoker

在您的代码中,创建了一个anonymous method。匿名方法的优点是它可以访问在myTimer_Elapsed中声明的局部变量。由于elapsedTimeelapsedCounter似乎外界宣布,你可以用一个明确定义的方法如下替换此:

private void MyMethod() { 
    this.lblElapsedTime.Text = elapsedTime.ToString();  

    if (elapsedCounter % 2 == 0)  
     this.lblValue.Text = EvenText;  
    else  
     this.lblValue.Text = OddText;  
} 

private void myTimer_Elapsed(Object myObject,EventArgs myEventArgs){  
    ... 

    if (elapsedTime.TotalMilliseconds < MaxTime)  
    { 
     MyDelegate delegateToMyMethod = MyMethod; 
     this.BeginInvoke(delegateToMyMethod);  
    }  
    else   
    {  
     ... 
    }  
}