Qual é a diferença entre métodos anônimos (C # 2.0) e expressões lambda (C # 3.0)? [duplicado]
-
03-07-2019 - |
Pergunta
Esta questão já tem uma resposta aqui:
- delegar palavra-chave vs. lambda notação 6 respostas
O que é a diferença entre métodos anônimos de C # 2.0 e lambda expressões de C # 3.0. / p>
Solução
A página do MSDN sobre métodos anônimos explica
Em versões do C # antes de 2.0, a única maneira de declarar um delegado era usar métodos chamados. C # 2.0 introduziu métodos anónimos e em C # 3.0 e depois, as expressões lambda substituem métodos anónimos como a forma preferida ao código embutido gravação. No entanto, o informações sobre métodos anônimos em Este tópico também se aplica a lambda expressões. Há um caso em que fornece um método anónimo funcionalidade não encontrado em lambda expressões. métodos anónimos permitir -lhe omitir a lista de parâmetros e Isto significa que um método anônimo podem ser convertidos para os delegados com um variedade de assinaturas. Isso não é possível com expressões lambda. Para mais informações especificamente sobre expressões lambda, consulte Lambda Expressões (C # guia de programação).
Uma expressão lambda é uma função anônima que pode conter expressões e declarações, e pode ser usado para criar delegados ou tipos de árvores de expressão. Todas as expressões lambda usar o operador lambda =>, que é lido como "vai". O lado esquerdo do operador lambda especifica os parâmetros de entrada (se houver) e o lado direito prende o bloco de expressão ou declaração. A expressão lambda x => x * x é lido "x vai para x vezes x." Esta expressão pode ser atribuído a um tipo delegado o seguinte:
Outras dicas
- As expressões lambda pode ser convertido para delegados ou árvores de expressão (com algumas restrições); métodos anônimos só pode ser convertido em delegados
- As expressões lambda permitem a inferência de tipos de parâmetros: expressões
- Lambda permitir que o corpo ser truncado para apenas uma expressão (para retornar um valor) ou declaração única (em outros casos) sem chaves. expressões
- Lambda permitir que a lista de parâmetros a ser encurtado para apenas o nome do parâmetro quando o tipo pode ser inferido e quando há apenas um único parâmetro métodos
- anônimos permitem a lista de parâmetros a ser totalmente omitido quando não é usado dentro do corpo e não levar a ambigüidade
O último ponto é o único benefício de métodos anônimos mais de lambdas, eu acredito. É útil para criar um campo semelhante evento com uma assinatura não-op no entanto:
public event EventHandler Click = delegate{};
- métodos anônimos são basicamente funções sem nome, com a capacidade de criar encerramentos.
- As expressões lambda são construções que são conversíveis em ambos os métodos anônimos e árvores de expressão, e seguem regras mais complexas de inferência de tipos de métodos anônimos.
A gama de diferenças mais ou menos sutis são explicados por Eric Lippert (C desenhador # idioma) em seu blog:
Em primeiro lugar, conveniência: lambdas são mais fáceis de ler e escrever
. Em segundo lugar, expressões: lambdas pode ser compilado para qualquer um delegado, ou uma árvore de expressão (Expression<T>
por algum delegado do tipo T, como Func<int,bool>
). Árvores de expressão são o mais emocionante, pois é a chave para LINQ para fora do processo de armazenamentos de dados.
Func<int,bool> isEven = i => i % 2 == 0;
Expression<Func<int,bool>> isEven = i => i % 2 == 0;
Note que as expressões lambda com corpos declaração só pode ser compilado para delegados, não Expression
s:
Action a = () => { Console.WriteLine(obj.ToString()); };