it-swarm-tr.com

Bir sınıfa etkinlik ekleme

Diyelim ki Kurbağa adında bir sınıfım var.

public class Frog
{
     public int Location { get; set; }
     public int JumpCount { get; set; }


     public void OnJump()
     {
         JumpCount++;
     }

}

2 konuda yardıma ihtiyacım var:

  1. Sınıf tanımında Jump adlı bir olay oluşturmak istiyorum.
  2. Kurbağa sınıfının bir örneğini oluşturmak ve Kurbağa zıpladığında çağrılacak başka bir yöntem oluşturmak istiyorum.
37
public static
public event EventHandler Jump;
public void OnJump()
{
    EventHandler handler = Jump;
    if (null != handler) handler(this, EventArgs.Empty);
}

sonra

Frog frog = new Frog();
frog.Jump += new EventHandler(yourMethod);

private void yourMethod(object s, EventArgs e)
{
     Console.WriteLine("Frog has Jumped!");
}
55
Quintin Robinson

@CQ: Neden yerel bir Jump kopyası yaratıyorsunuz? Ek olarak, etkinlik bildirimini biraz değiştirerek sonraki testi de kaydedebilirsiniz:

public event EventHandler Jump = delegate { };

public void OnJump()
{
    Jump(this, EventArgs.Empty);
}
1
Konrad Rudolph

Normal bir EventHandler veya özel bir temsilcinin nasıl kullanılacağına dair bir örnek. Olay null olursa temiz bir şekilde başarısız olacağını garanti etmek için ?. yerine . kullanıldığını unutmayın (null döndürün)

public delegate void MyAwesomeEventHandler(int rawr);
public event MyAwesomeEventHandler AwesomeJump;

public event EventHandler Jump;

public void OnJump()
{
    AwesomeJump?.Invoke(42);
    Jump?.Invoke(this, EventArgs.Empty);
}

Etkinliğin kendisinin yalnızca abone olmadığında boş olduğunu ve bir kez çağrıldığında etkinliğin iş parçacığının güvenli olduğunu unutmayın. Böylece olayın null olmadığından emin olmak için varsayılan bir boş işleyici de atayabilirsiniz. Bunun teknik olarak tüm olayları (GetInvocationList kullanarak) silen bir başkasına karşı savunmasız olduğunu unutmayın, bu yüzden dikkatli kullanın.

public event EventHandler Jump = delegate { };

public void OnJump()
{
    Jump(this, EventArgs.Empty);
}
0
Tezra