Что такое «замыкания» в .NET? - PullRequest
185 голосов
/ 09 января 2009

Что такое замыкание ? У нас они есть в .NET?


Если они существуют в .NET, не могли бы вы предоставить фрагмент кода (желательно на C #), объясняющий это?


РЕДАКТИРОВАТЬ: я просмотрел статью Джона Скита , чтобы понять, что такое замыкания и как их использовать в .NET.

Ответы [ 12 ]

0 голосов
/ 21 января 2016

Я тоже пытался это понять, ниже приведены фрагменты кода для того же кода в Javascript и C #, показывающие закрытие.

  1. Подсчитывать количество раз, когда происходило каждое событие или нет, когда нажимается каждая кнопка.

JavaScript:

var c = function ()
{
    var d = 0;

    function inner() {
      d++;
      alert(d);
  }

  return inner;
};

var a = c();
var b = c();

<body>
<input type=button value=call onClick="a()"/>
  <input type=button value=call onClick="b()"/>
</body>

C #:

using System.IO;
using System;

class Program
{
    static void Main()
    {
      var a = new a();
      var b = new a();

       a.call();
       a.call();
       a.call();

       b.call();
       b.call();
       b.call();
    }
}

public class a {

    int b = 0;

    public  void call()
    {
      b++;
     Console.WriteLine(b);
    }
}
  1. count Общее количество случаев, когда произошло нажатие, или общее количество кликов, независимо от элемента управления.

JavaScript:

var c = function ()
{
    var d = 0;

    function inner() {
     d++;
     alert(d);
  }

  return inner;
};

var a = c();

<input type=button value=call onClick="a()"/>
  <input type=button value=call onClick="a()"/>

C #:

using System.IO;
using System;

class Program
{
    static void Main()
    {
      var a = new a();
      var b = new a();

       a.call();
       a.call();
       a.call();

       b.call();
       b.call();
       b.call();
    }
}

public class a {

    static int b = 0;

    public void call()
    {
      b++;
     Console.WriteLine(b);
    }
}
0 голосов
/ 09 января 2009

Замыкание - это функция, определенная внутри функции, которая может обращаться к локальным переменным, а также к ее родительскому элементу.

public string GetByName(string name)
{
   List<things> theThings = new List<things>();
  return  theThings.Find<things>(t => t.Name == name)[0];
}

так что функция внутри метода find.

 t => t.Name == name

может обращаться к переменным внутри своей области видимости t и имени переменной, которая находится в родительской области видимости. Даже если он выполняется методом find как делегат, из другой области видимости все вместе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...