211 votes

Quelles sont les 'fermetures' dans .NET?

Qu'est-ce qu'une «fermeture»? Les avons-nous dans .NET?


Si elles existent dans .NET, pourriez-vous fournir un extrait de code (de préférence en C #) pour l'expliquer?


EDIT: J'ai parcouru l'article de Jon Skeet pour comprendre ce que sont les fermetures et comment les utiliser dans .NET.

278voto

Jon Skeet Points 692016

J'ai un article sur ce sujet. (Il y a beaucoup d'exemples.)

En essence, une clôture est un bloc de code qui peut être exécuté à une date ultérieure, mais qui maintient l'environnement dans lequel il a été créé à - dire qu'il peut toujours utiliser les variables locales etc de la méthode qui l'a créé, même après que la méthode a fini de s'exécuter.

La caractéristique générale de fermetures est implémenté en C# par les méthodes anonymes et les expressions lambda.

Voici un exemple d'utilisation d'une méthode anonyme:

using System;

class Test
{
    static void Main()
    {
        Action action = CreateAction();
        action();
        action();
    }

    static Action CreateAction()
    {
        int counter = 0;
        return delegate
        {
            // Yes, it could be done in one statement; 
            // but it is clearer like this.
            counter++;
            Console.WriteLine("counter={0}", counter);
        };
    }
}

Ici, nous pouvons voir que l'action retourné par Créeaction a encore accès à la variable compteur, et peut en effet augmenter, même si Créeaction lui-même a fini.

12voto

Dan Monego Points 3203

Les fermetures sont des valeurs fonctionnelles qui détiennent sur les valeurs de la variable à partir de leur champ d'application d'origine. C# peut les utiliser sous la forme de délégués anonymes.

Pour un exemple très simple, prenez ce code C#:

    delegate int testDel();

    static void Main(string[] args)
    {
        int foo = 4;
        testDel myClosure = delegate()
        {
            return foo;
        };
        int bar = myClosure();

    }

À la fin de celui-ci, un bar sera mis à 4, et la myClosure délégué peut être passé autour pour être utilisé ailleurs dans le programme.

Les fermetures peuvent être utilisés pour beaucoup de choses utiles, comme des retards dans l'exécution ou à simplifier les interfaces - LINQ est principalement construit à l'aide de fermetures. La plus immédiate à la façon dont il est pratique pour la plupart des développeurs est d'ajouter des gestionnaires d'événements pour créer dynamiquement des contrôles, vous pouvez utiliser les fermetures à ajouter un comportement lorsque le contrôle est instancié, plutôt que de stocker les données ailleurs.

10voto

AnthonyWJones Points 122520
<pre><code></code><p>Une fermeture est une fonction anonyme passée à l’extérieur de la fonction dans laquelle il est créé. Elle maintient toutes les variables de la fonction dans laquelle il est créé qu’il utilise.</p></pre>

4voto

Jason Bunting Points 27534

Voici un exemple artificiel pour c# que j’ai créé à partir de code similaire en JavaScript :

Donc, voici un code qui montre comment utiliser le code ci-dessus...

Espoir c’est un peu utile.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X