Pergunta

Qual é o significado dessa expressão "() =>". Eu já vi isso usado em um construtor:

return new MyItem(itemId, () => MyFunction(myParam));

Obrigado

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top