C # Для циклических параметров multythread возникает ошибка только без точки останова [duplicate]

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

Лучший способ подумать об этом процессе - это как будто вы генерируя текстовый файл динамически. Текст, который вы генерируете, становится исполняемым кодом после того, как браузер интерпретирует его. Только то, что вы размещаете между тегами <?php, оценивается на сервере.

Кстати, создание привычки встраивать случайные фрагменты PHP-логики в HTML или Javascript может привести к серьезному запутанному коду. Я говорю от болезненного опыта.

21
задан Eclipse 16 January 2009 в 21:08
поделиться

4 ответа

Что делает компилятор, это тянуть вашу лямбду и любые переменные, захваченные лямбдой, в генерируемый компилятором вложенный класс.

После компиляции ваш пример выглядит примерно так:

class Program
{
        delegate void Action();
        static void Main(string[] args)
        {
                List<Action> actions = new List<Action>();

                DisplayClass1 displayClass1 = new DisplayClass1();
                for (displayClass1.i = 0; displayClass1.i < 10; ++displayClass1.i )
                        actions.Add(new Action(displayClass1.Lambda));

                foreach (Action a in actions)
                        a();
        }

        class DisplayClass1
        {
                int i;
                void Lambda()
                {
                        Console.WriteLine(i);
                }
        }
}

Сделав копию в цикле for, компилятор генерирует новые объекты на каждой итерации, например:

for (int i = 0; i < 10; ++i)
{
    DisplayClass1 displayClass1 = new DisplayClass1();
    displayClass1.i = i;
    actions.Add(new Action(displayClass1.Lambda));
}
19
ответ дан Tinister 25 August 2018 в 19:35
поделиться

Единственное решение, которое я смог найти, это сначала сделать локальную копию:

for (int i = 0; i < 10; ++i)
{
    int copy = i;
    actions.Add(() => Console.WriteLine(copy));
}

Но у меня возникли проблемы с пониманием того, почему размещение копии внутри цикла for является любым другим чем наличие лямбда-захвата i.

10
ответ дан Eclipse 25 August 2018 в 19:35
поделиться
  • 1
    Поскольку объявление int находится внутри цикла for, поэтому он каждый раз воссоздается. Есть 10 разных ints, все названные «copy», где есть только один int named «i», в пределах области, которая получает curries. – technophile 16 January 2009 в 21:17

Единственное решение - сделать локальную копию и ссылку в пределах лямбда. Все переменные в C # (и VB.Net) при доступе в закрытии будут иметь семантику ссылок и семантику копирования / значения. Невозможно изменить это поведение на любом языке.

Примечание: на самом деле это не компиляция в качестве ссылки. Компилятор подталкивает переменную в класс замыкания и перенаправляет обращения «i» в поле «i» внутри данного класса замыкания. Часто легче думать об этом как о контрольной семантике.

9
ответ дан Martin Liversage 25 August 2018 в 19:35
поделиться

Помните, что лямбда-выражения на самом деле являются только синтаксическим сахаром для анонимных методов.

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

Вот ссылка, описывающая это. http://www.codeproject.com/KB/cs/InsideAnonymousMethods.aspx#4

1
ответ дан Matt Brunell 25 August 2018 в 19:35
поделиться
Другие вопросы по тегам:

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