using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Event_training
{
class Publisher
{
public event EventHandler x;
public void raise()
{
x(this, null);
}
}
class Subscriber
{
public void method1(object o, EventArgs e)
{
Console.WriteLine("metod1 called");
}
public void method2(object o, EventArgs e)
{
Console.WriteLine("metod2 called");
}
}
class Program
{
static void Main(string[] args)
{
Publisher p = new Publisher();
Subscriber s = new Subscriber();
p.x += s.method1;
p.x += s.method2;
p.raise();
}
}
}
没有时间过度交易"这个"关键词。它引用什么" x(this,null);"在这里?我可以使用别的东西代替"这个"?
答案 0 :(得分:1)
标准模式是
// it's not a public method
internal void raise()
{
// local copy for being thread safe
var localX = x;
// do not forget to check for null
if (null != localX)
localX(this, EventArgs.Empty); // standard EventArgs.Empty, not null
}
注意,this
是标准模式的部分:它显示哪个实例(即this
)引发事件。< / p>
答案 1 :(得分:1)
this
指的是班级的当前瞬间。
例如:
Publisher publisher = new Publisher();
publisher.raise();
在这种情况下,this
是publisher
个实例。也许更清楚的是我是否向你展示:
publisher.x(publisher, null);
此外,在您的情况下,甚至不使用第一个参数。所以你也可以写null, null
。
您调用的object o
通常称为sender
。这是有道理的,因为任何引发事件的对象都会通过此参数传递。
如果您想了解有关this
关键字的更多信息,请参阅微软网站(link)
答案 2 :(得分:1)
为什么需要传递inplace=False
的实例?假设您有多个发布者和一个订阅者:
Publisher
您订阅了两个发布商的 Publisher p1 = new Publisher() { Name = "Bob" };
Publisher p2 = new Publisher() { Name = "Joe" };
Subscriber s = new Subscriber();
个活动:
x
现在提问 - 你将如何知道哪个发布者在事件句柄中引发了事件?
p1.x += s.method1;
p2.x += s.method1;
这就是默认public void method1(object o, EventArgs e)
{
Console.WriteLine("metod1 called");
}
委托有两个参数的原因。第一个通常称为EventHandler
而不是sender
。这样您就可以检查o
并了解哪个发布商举办了活动。假设sender
还有Publisher
属性:
Name
现在在事件处理程序中,您可以获取发布者的名称,因为您已将发布者实例(class Publisher
{
public event EventHandler x;
public string Name { get; set; }
public void Raise()
{
EventHandler x = this.x;
if (x != null)
x(this, EventArgs.Empty);
}
}
)传递给偶数处理程序:
this
如果您不需要传递引发事件的任何事件参数和对象实例,那么您可以使用其他类型的委托进行事件。例如。 Action
代表没有任何参数。
public void method1(object sender, EventArgs e)
{
Publisher publisher = (Publisher)sender;
Console.WriteLine(publisher.Name + " raised event x");
}
处理程序看起来像:
class Publisher
{
public event Action x;
public void Raise()
{
Action x = this.x;
if (x != null)
x(); // No parameters
}
}