在讨论事件处理程序时,C#中的关键字是什么意思?

时间:2011-08-11 13:16:49

标签: c# events event-handling

当我为csharp编写事件处理程序时,它看起来像这样:

public void FooHandler(object sender, EventArgs e)
{
    //do stuff..
    this.doSomething();  //Does the "this" keyword mean something in this context?
}

“this”关键字在此上下文中是否意味着什么?

编辑:

假设我也有这段代码:

public class GizmoManager {
    public void Manage() {
        g = new Gizmo();
        g.Foo += new EventHandler(FooHandler);
    }
}

thisFooHandler内)指的是什么?

3 个答案:

答案 0 :(得分:2)

是的,它是对FooHandler()被调用的对象的引用。代理能够引用静态和非静态方法。在谈论非静态的时候,this是对象实例的引用。

class A
{
   public delegate void MyDelegate(object sender, int x);
   public event MyDelegate TheEvent;

   public void func()
   {
     if(TheEvent != null) TheEvent(this, 123);
   }
}

class B
{
   public B()
   {
     A a = new A();
     a.TheEvent += handler;
     a.func();
   }

   public void handler(object sender, int x)
   {
      // "sender" is a reference to object of type A that we've created in ctor
      // "x" is 123
      // "this" is a reference to B (b below)
   } 
}

B b = new B(); // here it starts

更多细节。你的代码:

g = new Gizmo();
g.Foo += new EventHandler(FooHandler);

可以像这样重写

g = new Gizmo();
g.Foo += new EventHandler(this.FooHandler); // look here

在这种情况下,this与处理程序中的this相同; - )

更重要的是,如果您在理解this时遇到一些问题:

class X
{
  int a;

  public X(int b)
  {
    this.a = b; // this stands for "this object"
    // a = b is absolutely the same
  }

  public X getItsThis()
  {
    return this;
  }
}

X x = new X();
X x2 = x.getItsThis();
// x and x2 refer to THE SAME object
// there's still only one object of class X, but 2 references: x and x2

答案 1 :(得分:2)

更完整...

public class Bar
{
  public Bar()
  {
    Gizmo g = new Gizmo();
    g.Foo += new EventHandler(FooHandler);

  }

  public void FooHandler(object sender, EventArgs e)
  {
    //do stuff..
    this  //Does the "this" keyword mean something in this context?
  }
}

“this”将引用Bar的实例

答案 2 :(得分:1)

this将引用您当前所在的类,而不是方法。

来自MSDN

  

this关键字引用类的当前实例。静态的   成员函数没有this指针。这个关键字可以是   用于从构造函数,实例方法和内部访问成员   实例访问器。

在您的示例中,this.doSomething()引用该方法之外的某个任意类中的方法。 this是多余的。

在以下情况下使用this非常有用:

public Employee(string name, string alias) 
{
   this.name = name;
   this.alias = alias;
}

它有助于界定意义。否则,没有this您真正指的是namealias

最后,sender将引用引发此事件的object