it-swarm-vi.tech

Cách thêm sự kiện vào lớp

Nói rằng tôi có một lớp tên là Frog, nó trông giống như:

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


     public void OnJump()
     {
         JumpCount++;
     }

}

Tôi cần giúp đỡ với 2 điều:

  1. Tôi muốn tạo một sự kiện có tên Jump trong định nghĩa lớp.
  2. Tôi muốn tạo một thể hiện của lớp Frog, và sau đó tạo một phương thức khác sẽ được gọi khi Frog nhảy.
37
public static
public event EventHandler Jump;
public void OnJump()
{
    EventHandler handler = Jump;
    if (null != handler) handler(this, EventArgs.Empty);
}

sau đó

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: Tại sao bạn tạo một bản sao cục bộ của Jump? Ngoài ra, bạn có thể lưu bài kiểm tra tiếp theo bằng cách thay đổi một chút tuyên bố của sự kiện:

public event EventHandler Jump = delegate { };

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

Dưới đây là ví dụ về cách sử dụng EventHandler bình thường hoặc đại biểu tùy chỉnh. Lưu ý rằng ?. được sử dụng thay vì . để đảm bảo rằng nếu sự kiện là null, nó sẽ thất bại sạch sẽ (trả về null)

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);
}

Lưu ý rằng bản thân sự kiện chỉ là null nếu không có người đăng ký và một khi được gọi, sự kiện này là luồng an toàn. Vì vậy, bạn cũng có thể chỉ định một trình xử lý trống mặc định để đảm bảo sự kiện không phải là null. Lưu ý rằng điều này dễ bị tổn thương về mặt kỹ thuật đối với người khác xóa sạch tất cả các sự kiện (sử dụng GetInvocationList), vì vậy hãy thận trọng khi sử dụng.

public event EventHandler Jump = delegate { };

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