Что такое 'закрытия' в.NET?

Security Warning: этот ответ не соответствует лучшим рекомендациям по безопасности. Эвакуация неадекватна для предотвращения SQL-инъекции , вместо этого используйте подготовленные операторы . Используйте стратегию, изложенную ниже, на свой страх и риск. (Кроме того, mysql_real_escape_string() был удален в PHP 7.)

Вы могли бы сделать что-то основное:

$safe_variable = mysql_real_escape_string($_POST["user-input"]);
mysql_query("INSERT INTO table (column) VALUES ('" . $safe_variable . "')");

Это не решит каждую проблему, но это очень хороший ступень. Я оставил очевидные элементы, такие как проверка существования переменной, числа (числа, буквы и т. Д.).

190
задан Adam Hawkes 16 August 2016 в 05:38
поделиться

7 ответов

Я имею статья об этой самой теме . (Это имеет много примеров.)

В сущности, закрытие является блоком кода, который может быть выполнен в более позднее время, но который поддерживает среду, в которой оно было сначала создано - т.е. оно может все еще использовать локальные переменные и т.д. метода, который создал его, даже после того, как тот метод закончил выполняться.

общая опция закрытий реализована в C# анонимными методами и лямбда-выражениями.

Вот пример с помощью анонимного метода:

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

Вывод:

counter=1
counter=2

Здесь мы видим, что действие, возвращенное CreateAction все еще, имеет доступ к переменной счетчика и может действительно увеличить его, даже при том, что сам CreateAction закончился.

247
ответ дан Jon Skeet 23 November 2019 в 05:37
поделиться

Закрытия являются функциональными значениями, которые придерживаются ценностей переменных от их исходного объема. C# может использовать их в форме анонимных делегатов.

Для очень простого примера, возьмите этот код C#:

    delegate int testDel();

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

    }

В конце его, панель будет установлена на 4, и делегат myClosure может быть роздан, чтобы использоваться в другом месте в программе.

Закрытия могут использоваться для большого количества полезных вещей, как задержанное выполнение или упростить интерфейсы - LINQ главным образом создается с помощью закрытий. Самым непосредственным путем это пригождается для большинства разработчиков, добавляют обработчики событий к динамично созданным средствам управления - можно использовать закрытия для добавления поведения, когда управление инстанцируют, вместо того, чтобы хранить данные в другом месте.

9
ответ дан Dan Monego 23 November 2019 в 05:37
поделиться
Func<int, int> GetMultiplier(int a)
{
     return delegate(int b) { return a * b; } ;
}
//...
var fn2 = GetMultiplier(2);
var fn3 = GetMultiplier(3);
Console.WriteLine(fn2(2));  //outputs 4
Console.WriteLine(fn2(3));  //outputs 6
Console.WriteLine(fn3(2));  //outputs 6
Console.WriteLine(fn3(3));  //outputs 9

закрытие А является анонимной функцией, переданной за пределами функции, в которой оно создается. Это поддерживает любые переменные от функции, в которой это создается, что это использует.

7
ответ дан Anoop Vaidya 23 November 2019 в 05:37
поделиться

Вот изобретенный пример для C#, который я создал из подобного кода в JavaScript:

public delegate T Iterator<T>() where T : class;

public Iterator<T> CreateIterator<T>(IList<T> x) where T : class
{
        var i = 0; 
        return delegate { return (i < x.Count) ? x[i++] : null; };
}

Так, вот некоторый код, который показывает, как использовать вышеупомянутый код...

var iterator = CreateIterator(new string[3] { "Foo", "Bar", "Baz"});

// So, although CreateIterator() has been called and returned, the variable 
// "i" within CreateIterator() will live on because of a closure created 
// within that method, so that every time the anonymous delegate returned 
// from it is called (by calling iterator()) it's value will increment.

string currentString;    
currentString = iterator(); // currentString is now "Foo"
currentString = iterator(); // currentString is now "Bar"
currentString = iterator(); // currentString is now "Baz"
currentString = iterator(); // currentString is now null

Hope, которая несколько услужлива.

4
ответ дан Jason Bunting 23 November 2019 в 05:37
поделиться

В основном закрытие является блоком кода, который можно передать как аргумент функции. C# поддерживает закрытия в форме анонимных делегатов.

Вот простой пример:
Список. Найдите, что метод может принять и выполнить часть кода (закрытие) для нахождения объекта списка.

// Passing a block of code as a function argument
List<int> ints = new List<int> {1, 2, 3};
ints.Find(delegate(int value) { return value == 1; });

Используя синтаксис C#3.0 мы можем записать это как:

ints.Find(value => value == 1);
2
ответ дан aku 23 November 2019 в 05:37
поделиться

Закрытия являются блоками кода, которые ссылаются на переменную вне себя, (от ниже их на стеке), который можно было бы назвать или выполнить позже, (как то, когда событие или делегат определяются и могли зайтись некоторый неопределенный момент в будущем вовремя)... Поскольку внешняя переменная, что блок ссылок кода может вышедший объем (и был бы иначе потерян), то, что на это ссылается блок кода (названный закрытием), говорит времени выполнения "содержать" ту переменную в объеме, пока это больше не необходимо блоку закрытия кода...

1
ответ дан Charles Bretana 23 November 2019 в 05:37
поделиться

Закрытие является функцией, определенной в функции, которая может получить доступ к локальным переменным его, а также ее родителя.

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

так функция в методе находки.

 t => t.Name == name

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

-1
ответ дан DevelopingChris 23 November 2019 в 05:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: