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.
答案 0 :(得分:4)
1)它不属于任何人。它是.NET框架中单独定义的类型
2)是的。它是在BackgroundWorker
类上定义的(可以通过按F1在MSDN中查找它或通过在BackgroundWorker
类的实例上调用它来见证)
3)它是语法糖。编译器可以帮助您减少输入。
谷歌搜索“事件和代表.net”将显示很多非常好的解释。
答案 1 :(得分:1)
您对问题的简短回答是:
事件处理程序对象不一定属于任何类。它们在框架中被定义为适当的命名空间,就像任何其他对象一样。您可以在任何可以定义类的位置定义委托,因此可以将其放在命名空间中或嵌套在另一个类中。位置只取决于什么是有道理的。在您的特定示例中,ProgressChangedEventHandler
属于System.ComponentModel
命名空间,并未嵌套在另一个类中。
是,ProgressChanged
在一个事件中,它也是System.ComponentModel
命名空间的一部分。
是的,那个速记有效。您比较的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或此,具体取决于目标方法是否为静态。