Question

Quel est le sens de cette expression " () = > " ;. Je l'ai vu utilisé dans un constructeur:

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

Merci

Était-ce utile?

La solution

C'est un délégué sans paramètres, écrit en lambda. Identique à:

return new MyItem(itemId, delegate() {return MyFunction(myParam); });

Autres conseils

Il s'agit d'une expression lambda . Le code de votre exemple est équivalent à ceci:

return new MyItem(itemId, delegate() { MyFunction(myParam); });

Beaucoup de gens ont répondu qu'il ne s'agissait que d'une fonction anonyme. Mais cela dépend vraiment de la façon dont MyItem est déclaré. Si c'est déclaré comme ça

MyItem(int itemId, Action action)

Alors oui, le () = > {} sera compilé en une fonction anonyme. Mais si MyItem est déclaré comme ceci:

MyItem(int itemId, Expression<Action> expression)

Ensuite, le () = > {} sera compilé dans un arbre d’expression, c’est-à-dire que le constructeur MyItem recevra une structure d’objet qu’il pourra utiliser pour examiner le code réel à l’intérieur du () = > Le bloc {} était. Linq s'appuie beaucoup sur cela, par exemple dans Linq2Sql, où LinqProvider examine l'arborescence des expressions pour déterminer comment créer une requête SQL basée sur une expression.

Mais dans la plupart des cas () = > {} sera compilé dans une fonction anonyme.

Il s'agit de l'expression lambda .

C’est une expression lambda, qui est à peu près équivalente à un délégué anonyme, bien que beaucoup plus puissant

Voilà une expression lambda . Le compilateur crée automatiquement des délégués ou des types d’arbre d’expression

Voici les exemples simples de lambda que je viens de créer:

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);
    }
}

Le résultat sera:

  

Test

     

TEST

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top