Pergunta

dizer que tenho uma classe chamada sapo, parece que:

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


     public void OnJump()
     {
         JumpCount++;
     }

}

Eu preciso de ajuda com 2 coisas:

  1. Eu quero criar um evento chamado Salte na definição de classe.
  2. Eu quero criar uma instância da classe sapo, e, em seguida, criar um outro método que será chamado quando o sapo pula.
Foi útil?

Solução

public event EventHandler Jump;
public void OnJump()
{
    EventHandler handler = Jump;
    if (null != handler) handler(this, EventArgs.Empty);
}

então

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

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

Outras dicas

@CQ: Por que você criar uma cópia local do Jump? Além disso, você pode salvar o teste posterior, alterando ligeiramente a declaração do evento:

public event EventHandler Jump = delegate { };

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

Aqui está um exemplo de como usar um EventHandler normal, ou um delegado personalizado. Note-se que ?. é usado em vez de . para garantir que se o evento é nulo, ele irá falhar de forma limpa (return 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);
}

Note que o evento em si só é nulo se não houver assinantes, e que uma vez chamado, o evento é thread-safe. Então você também pode atribuir um manipulador de vazio padrão para garantir que o evento não é nulo. Note-se que este é tecnicamente vulnerável a alguém acabando com todos os eventos (usando GetInvocationList), assim use com cuidado.

public event EventHandler Jump = delegate { };

public void OnJump()
{
    Jump(this, EventArgs.Empty);
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top