0
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.
4

3 回答 3

4

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

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

3)它是语法糖。编译器可帮助您减少打字。

谷歌搜索“events and delegates .net”会显示很多很好的解释。

于 2012-09-20T08:24:14.833 回答
1

对您的问题的简短回答是:

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

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

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

于 2012-09-20T08:31:19.860 回答
1

一个代表,反过来,原来是一个类。

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

“ProgressChangedEventHandler”属于哪个类?

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

“ProgressChanged”是一个事件吗?

是的,它是 BackgroundWorker 类的事件。除了 DoWork 和 RunWorkerCompleted,您几乎总是订阅另外两个事件。

如果我没有指定“new ProgressChangedEventHandler”,代码仍然可以编译吗?

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

于 2012-09-20T09:04:28.037 回答