背景工人类中的代表和事件

时间:2012-09-20 08:18:58

标签: c# .net visual-studio-2010

Thread1.WorkerReportsProgress = true;  
Thread1.ProgressChanged += new ProgressChangedEventHandler(Function2HandleWhenProgressChanges); //When progress changes, define a function to handle  it.
Thread1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(Function2HandleWhenThreadIsFinished); //The function to run when the thread is finished
Thread1.DoWork += new DoWorkEventHandler(Thread1_DoWorkDo); //The function defining what the thread must do.

现在,我了解ProgressChangedEventHandler是一个委托。反过来,一名代表原来是一个班级。

1。 “ProgressChangedEventHandler”属于哪个类?我的代码中没有定义任何内容。

2。 “ProgressChanged”是一个活动吗?如果是这样,这属于哪个类?

第3。如果我没有指定“new ProgressChangedEventHandler”仍然代码编译?如下所示。

 Thread1.WorkerReportsProgress = true;  
 Thread1.ProgressChanged += Function2HandleWhenProgressChanges; //When progress changes,  define a function to handle  it.
 Thread1.RunWorkerCompleted += Function2HandleWhenThreadIsFinished; //The function to run when the thread is finished
 Thread1.DoWork += Thread1_DoWorkDo; //The function defining what the thread must do.

3 个答案:

答案 0 :(得分:4)

1)它不属于任何人。它是.NET框架中单独定义的类型

2)是的。它是在BackgroundWorker类上定义的(可以通过按F1在MSDN中查找它或通过在BackgroundWorker类的实例上调用它来见证)

3)它是语法糖。编译器可以帮助您减少输入。

谷歌搜索“事件和代表.net”将显示很多非常好的解释。

答案 1 :(得分:1)

您对问题的简短回答是:

  1. 事件处理程序对象不一定属于任何类。它们在框架中被定义为适当的命名空间,就像任何其他对象一样。您可以在任何可以定义类的位置定义委托,因此可以将其放在命名空间中或嵌套在另一个类中。位置只取决于什么是有道理的。在您的特定示例中,ProgressChangedEventHandler属于System.ComponentModel命名空间,并未嵌套在另一个类中。

  2. 是,ProgressChanged在一个事件中,它也是System.ComponentModel命名空间的一部分。

  3. 是的,那个速记有效。您比较的2种格式通常被认为是相同的符号并编译为相同的IL,因此如果您愿意,可以随意使用。实际上有一个很好的SO question讨论了这个符号,因为我在一周前有同样的问题

答案 2 :(得分:1)

  

反过来,一名代表原来是一个班级。

它不是一个类,它是类型。这解释了为什么你问这些其他问题。可以将其视为方法的类型描述,返回类型和参数很重要。委托类型有助于编译器确保分配正确类型的事件处理程序方法。该方法必须具有与委托类型完全相同的返回类型和参数。编译器会抱怨,如果不是这样的话。这种类型的安全性在.NET中非常重要。

  

“ProgressChangedEventHandler”属于哪个类?

它是委托类型,而不是类。它在.NET框架中声明。添加对System.dll的引用并将using System.ComponentModel放在程序的顶部允许您在不拼写完整类型名称的情况下使用它。

  

“ProgressChanged”是一个活动吗?

是的,它是BackgroundWorker类的事件。与DoWork和RunWorkerCompleted一起,您几乎总是订阅其他两个事件。

  

如果我没有指定“new ProgressChangedEventHandler”仍然会编译代码?。

这就是所谓的“语法糖”。 C#编译器可以告诉事件类型需要哪种委托类型,并根据需要自动生成语句的“new ProgressChangedEventHandler”部分。很方便。然而,IntelliSense将始终生成它。即使完整的语句是语法糖,您也从未显式分配Delegate.Target属性。编译器将其推断为null或,具体取决于目标方法是否为静态。