Что означает это ключевое слово в C #, когда речь идет об обработчиках событий? - PullRequest
1 голос
/ 11 августа 2011

Когда я пишу обработчик событий для csharp, он выглядит следующим образом:

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

Значит ли ключевое слово "this" что-то в этом контексте?

EDIT:

Допустим, у меня также есть этот код:

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

На что будет ссылаться this (в пределах FooHandler)?

Ответы [ 3 ]

2 голосов
/ 11 августа 2011

более полно ...

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 голосов
/ 11 августа 2011

Да, это ссылка на объект, для которого вызывается 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 голос
/ 11 августа 2011

this будет ссылаться на текущий класс, в котором вы находитесь, а не на метод.

С MSDN ,

Это ключевое слово относится к текущему экземпляру класса. статический Функции-члены не имеют указатель this. Это ключевое слово может быть используется для доступа к членам внутри конструкторов, методов экземпляра и средства доступа к экземплярам.

В вашем примере this.doSomething() относится к методу в некотором произвольном классе за пределами этого метода. this является избыточным.

Полезно использовать this в таких случаях:

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

Это помогает разграничить значение. В противном случае, без this что name или alias вы действительно имеете в виду?

Наконец, sender будет ссылаться на object, который вызвал событие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...