Qual é a diferença entre métodos anônimos (C # 2.0) e expressões lambda (C # 3.0)? [duplicado]

StackOverflow https://stackoverflow.com/questions/208381

  •  03-07-2019
  •  | 
  •  

Pergunta

Esta questão já tem uma resposta aqui:

O que é a diferença entre métodos anônimos de C # 2.0 e lambda expressões de C # 3.0.

Foi útil?

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).

E sobre expressões lambda :

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

  1. 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
  2. As expressões lambda permitem a inferência de tipos de parâmetros:
  3. expressões
  4. 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.
  5. expressões
  6. 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
  7. métodos
  8. 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{};
  1. métodos anônimos são basicamente funções sem nome, com a capacidade de criar encerramentos.
  2. 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 Expressions:

Action a = () => { Console.WriteLine(obj.ToString()); };
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top