我可以使用别的东西代替"这个"在这段代码?

时间:2015-10-15 07:57:03

标签: c# events this

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);"在这里?我可以使用别的东西代替"这个"?

3 个答案:

答案 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();

在这种情况下,thispublisher个实例。也许更清楚的是我是否向你展示: 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
    }
}