在C#中,当谈到事件处理程序时,this这个关键字意味着什么?

在C#中,当谈到事件处理程序时,this这个关键字意味着什么?,c#,events,event-handling,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? } public Employee(string name, string alias) { this.name = name;

当我为csharp编写事件处理程序时,它如下所示:

public void FooHandler(object sender, EventArgs e)
{
    //do stuff..
    this.doSomething();  //Does the "this" keyword mean something in this context?
}
public Employee(string name, string alias) 
{
   this.name = name;
   this.alias = alias;
}
“this”关键字在这个上下文中有什么意思吗

编辑:

假设我还有以下代码:

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

this
(在
foodhandler
中)指的是什么?

是的,它是对调用
foodhandler()
的对象的引用。委托能够引用静态和非静态方法。当谈到非静态对象时,
这是对对象实例的引用

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
在本例中,
与处理程序中的
相同;-)

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

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

是的,它是对调用
foodhandler()
的对象的引用。委托能够引用静态和非静态方法。当谈到非静态对象时,
这是对对象实例的引用

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
在本例中,
与处理程序中的
相同;-)

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

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

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

this关键字引用类的当前实例。静止的 成员函数没有此指针的名称。该关键字可以是 用于从构造函数、实例方法和 实例访问器

在您的示例中,
this.doSomething()
引用了该方法之外的任意类中的方法<代码>此
是冗余的

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

public void FooHandler(object sender, EventArgs e)
{
    //do stuff..
    this.doSomething();  //Does the "this" keyword mean something in this context?
}
public Employee(string name, string alias) 
{
   this.name = name;
   this.alias = alias;
}
它有助于在意义之间进行划分。否则,如果没有
您真正指的是什么
名称
别名


最后,
sender
将引用引发事件的
对象。

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

this关键字引用类的当前实例。静止的 成员函数没有此指针的名称。该关键字可以是 用于从构造函数、实例方法和 实例访问器

在您的示例中,
this.doSomething()
引用了该方法之外的任意类中的方法<代码>此
是冗余的

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

public void FooHandler(object sender, EventArgs e)
{
    //do stuff..
    this.doSomething();  //Does the "this" keyword mean something in this context?
}
public Employee(string name, string alias) 
{
   this.name = name;
   this.alias = alias;
}
它有助于在意义之间进行划分。否则,如果没有
您真正指的是什么
名称
别名

最后,
sender
将引用引发事件的
对象。

更完整

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实例

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的一个实例

关键字在右边的行中不是唯一的?是的,
将仅引用您的
Gizmo
类中的
g
sender
将引用调用
EventHandler
的类。Leito,我目前有两个相互矛盾的答案。阅读@loki的回答,因为他比我更清楚,看看你是否仍然说同样的话。自相矛盾,因为我认为我们谈论的不是同一个
这个
。如果您一直编辑问题并每次更改代码,则有点难以理解,注释也会过时:)。在您的示例中,
this
指的是拥有
foodhandler
的类,该
关键字在右边的行中不是唯一的?是的,
this
仅指您的
Gizmo
类中的
g
sender
将引用调用
EventHandler
的类。Leito,我目前有两个相互矛盾的答案。阅读@loki的回答,因为他比我更清楚,看看你是否仍然说同样的话。自相矛盾,因为我认为我们谈论的不是同一个
这个
。如果您一直编辑问题并每次更改代码,则有点难以理解,注释也会过时:)。在您的示例中,
this
引用拥有
foodhandler
的类。这是有道理的。在这种情况下,
sender
会是
g
实例吗?是的,sender会引用“触发”事件的OJBEC,为了清楚起见,最有可能是gI实例建议,将顶部的类
Foo
重命名为
Bar
,以确保该类与
Gizmo
中其他地方定义的
Foo
事件无关。这是有道理的。在这种情况下,
sender
会是
g
实例吗?是的,sender会引用“触发”事件的OJBEC,为了清楚起见,最有可能是gI实例建议,您将顶部的类
Foo
重命名为
Bar
,以确保该类与
Gizmo
中其他地方定义的
Foo
事件无关。嗯,我并不是想把事情复杂化,但是如果
这个
在您的示例中指的是
b
,那么在我的问题中,
这个
不是指
g
对吗?因为我的示例中的
g
与您的示例中的
a
相同(不是
b
),对吗?在您的示例中,
foodhandler()
是非静态方法。这意味着,此方法总是针对某个类的对象调用<代码>此
引用此对象。因此,在您的例子中,
这个
将引用您拥有的
g=newgizmo()的对象;g、 Foo+=新电动汽车