Usuário com melhor resposta
Eventos Lambda

Pergunta
-
Boa Tarde,
Eu não sei como eu UNREGISTER um evento em lambda. Porque eu conheço dois meios de capturar um evento segue abaixo.
// isso REGISTER o evento. se eu estiver errado me corrija.
PESSOA_CARRO_MARCA .OnGetMarcaCompleted += PESSOA_CARRO_MARCA_OnGetMarcaCompleted;
void PESSOA_CARRO_MARCA_OnGetMarcaCompleted(object sender, EventArgs e)
{
// isso UNREGISTER o evento; a diferença ta no sinal de + e -
PESSOA_CARRO_MARCA .OnGetMarcaCompleted -= PESSOA_CARRO_MARCA_OnGetMarcaCompleted;
}
mas quando eu uso o evento do jeito abaixo nao sei como dar um UNREGISTER. Alguem Sabe.???
PESSOA_CARRO_MARCA .OnGetMarcaCompleted += (s, e) =>
{
// aqui seria o codigo para o UNREGISTER.
};
Se alguem puder me ajudar agradeço desde já.
Obrigado a todos.
- Editado Molinari quarta-feira, 24 de novembro de 2010 17:09 .
Respostas
-
Então eu (particularmente) não aconselho a usar lambda quando:
- Eventos Estáticos
- Objetos Instanciados que serão acessados por diversas classes
- Quando por algum motivo vc prescisar remover a atribuição do metodo do evento
Eu aconcelho a usar o Lambda quando:
- No caso de objetos instaciando em contextos menores que um simples métodos
Nos demais casos, fica ao gosto do programador... sigo essa metodologia tendo em vista sempre manter o sistema "graficamente" claro para o caso de outra pessoa precisar dar manutenção no mesmo.... usar lambda para coisas muito complexas dificulta um pouco a compreensão se vc não estiver acostumando ao programa em si....
Eu não sou pago para postar aqui... faço simplesmente porque eu quero....- Sugerido como Resposta Ari C. RaimundoModerator quinta-feira, 25 de novembro de 2010 00:12
- Marcado como Resposta Molinari quinta-feira, 25 de novembro de 2010 10:44
Todas as Respostas
-
Ola,
Normalmente vc usa evento lambda, em propriedades dentro de um escopo especifico, como o de um metodo ou de um bloco try/cath po exemplo:
try {
var objeto = new TipoDaClasse();
objeto.Evento += (s, e) { [...] }
objeto.Metodo();
[...]
} catch {
}se vc esta usando uma propriedade ou um field de uma classe que vai perdurar por uma escopo maior... entao vc usa ainda a atribuição de um metodo para o evento e não a equação lambda...
public class TipoA {
public TipoB tipoB { get; set; }
public TipoA() {
tipoB = new tipoB();
tipoB.Evento += tipoB_Evento();
}
private void tipoB_Evento(...) {}
}Leve em consideração que o Lambda é feito para ajudar em casos especificos e não para substituir a forma de propragração de eventos.
Eu não sou pago para postar aqui... faço simplesmente porque eu quero.... -
-
Então eu (particularmente) não aconselho a usar lambda quando:
- Eventos Estáticos
- Objetos Instanciados que serão acessados por diversas classes
- Quando por algum motivo vc prescisar remover a atribuição do metodo do evento
Eu aconcelho a usar o Lambda quando:
- No caso de objetos instaciando em contextos menores que um simples métodos
Nos demais casos, fica ao gosto do programador... sigo essa metodologia tendo em vista sempre manter o sistema "graficamente" claro para o caso de outra pessoa precisar dar manutenção no mesmo.... usar lambda para coisas muito complexas dificulta um pouco a compreensão se vc não estiver acostumando ao programa em si....
Eu não sou pago para postar aqui... faço simplesmente porque eu quero....- Sugerido como Resposta Ari C. RaimundoModerator quinta-feira, 25 de novembro de 2010 00:12
- Marcado como Resposta Molinari quinta-feira, 25 de novembro de 2010 10:44
-
Rui, Obrigado
Mais uma coisa, você tem um link ae para eu ver um exemplo de como organizar meu codigo com esses eventos sem o lambda, tipo uma separação por #REGION ou utiliza o evento no metodo acima e no metodo abaixo ja coloca o retorno do metodo?
-
Ah então... isso depende muito da metologia da empresa... pelo que eu entendi vc apenas quer um retorno de um metodo assincrono... mas não entendi o porque vc pretende "desregitrar" o metodo do evento...
Eu particularmente trabalharia desta forma:
public void CarregarMarcas() {
var pessoaCarroMarca = PESSOA_CARRO_MARCA;
if (pessoaCarroMarca != null) {
pessoaCarroMarca.OnGetMarcaCompleted += (s, e) => {
dataGrid.DataSource = e.Result;
};
pessoaCarroMarca.GetMarcaAsync();
}
}Como "pessoaCarroMarca" esta dentro do escopo do metodo, ela vai deixa de "existir" ao termino da execução... não ficando atribuito o evento em "PESSOA_CARRO_MARCA"
Eu não sou pago para postar aqui... faço simplesmente porque eu quero.... -
Entao, suponha que nesse metodo que voce fez apos carregar esse dataGrid voce queira preencher mais um dataGrid e no completed do segundo voce queira
mais um ... ae meus eventos se perde e nao sei o motivo(posso tar criando os eventos errados nao sei ou algo do tipo)...mas entao se eu uso o register e o ungister ele passa legal por onde mandei passar.. talvez seja pq os metodos que eu to usando são Static ... como voce disse "nao usar lambda com static"...
mas blz...
-
Ah... então.. metodos estaticos muda tudo :)
Voce pode fazer algo mais ou menos assim:
public class XOXOXOX {
# Metodos Estaticos
# Implementacao de Eventos Estaticos# Private Fields
# Propriedades# Eventos
# Construtores
# Metodos Publicos
# Metodos Privados
# Metodos Protegidos
}
Eu não sou pago para postar aqui... faço simplesmente porque eu quero.... -