c # 3.0 Significado da expressão () =>
Pergunta
Qual é o significado dessa expressão "() =>". Eu já vi isso usado em um construtor:
return new MyItem(itemId, () => MyFunction(myParam));
Obrigado
Solução
É um delegado sem parâmetros, escrito como um lambda. Mesmo que:
return new MyItem(itemId, delegate() {return MyFunction(myParam); });
Outras dicas
Isso é um lambda expressão . O código no seu exemplo é equivalente a esta:
return new MyItem(itemId, delegate() { MyFunction(myParam); });
Um monte de pessoas têm respondeu que esta é apenas uma função anônima. Mas isso realmente depende de como MyItem é declarada. Se for declarada como este
MyItem(int itemId, Action action)
Então, sim, o () => {} será compilado para uma função anônima. Mas se MyItem é declarada como este:
MyItem(int itemId, Expression<Action> expression)
Em seguida, a () => {} serão compilados em uma árvore de expressão, ou seja, MyItem construtor receberá uma estrutura de objetos que ele pode usar para examinar o que o código real dentro do bloco () => {} foi. Linq depende fortemente este por exemplo, em Linq2Sql onde o LinqProvider examina a árvore de expressão para descobrir como construir uma consulta SQL com base em uma expressão.
Mas na maioria dos casos () => {} serão compilados em uma função anônima.
É a lambda expressão.
É uma expressão lambda, que é aproximadamente equivalente a um delegado anônimo, embora muito mais poderoso
ya este é um lambda expressão . O compilador cria automaticamente delegados ou tipos de árvore de expressão
Eis os exemplos simples de lambda I acabou de criar:
internal class Program
{
private static void Main(string[] args)
{
var item = new MyItem("Test");
Console.WriteLine(item.Text);
item.ChangeText(arg => MyFunc(item.Text));
Console.WriteLine(item.Text);
}
private static string MyFunc(string text)
{
return text.ToUpper();
}
}
internal class MyItem
{
public string Text { get; private set; }
public MyItem(string text)
{
Text = text;
}
public void ChangeText(Func<string, string> func)
{
Text = func(Text);
}
}
A saída será:
Test
Test