Visual Studio, отлаживающая “быстрые часы” инструмент и лямбда-выражения

Попробуйте этот подход.

var arr1 = [];
var carr = ['product name', 'product type', 'assigned person'];
$("#table-availed-prod tr").map(function(i, tr){
	var arr = {};
	$(this).find('td').map(function(j, td){
       if(carr.indexOf(j) !== -1){
			arr[carr[j]] = $(this).text();
		}
	});
	arr1.push(arr);
});

console.log(arr1);

95
задан user2418306 27 January 2017 в 12:45
поделиться

5 ответов

Лямбда-выражения, как анонимные методы, являются на самом деле очень сложными зверями. Даже если мы исключаем Expression (.NET 3.5), который все еще оставляет большую сложность, не в последнюю очередь полученную переменные, которые существенно реструктурируют код, который использует их (о чем Вы думаете как, переменные становятся полями на сгенерированных компилятором классах), с небольшим количеством обмана.

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

64
ответ дан Marc Gravell 24 November 2019 в 05:47
поделиться

Нет Вы не можете использовать лямбда-выражения в часах / местные жители / непосредственное окно. Поскольку Marc указал, что это невероятно сложно. Я хотел погрузиться немного далее в тему все же.

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

Рассмотрите следующий код.

void Example() {
  var v1 = 42;
  var v2 = 56; 
  Func<int> func1 = () => v1;
  System.Diagnostics.Debugger.Break();
  var v3 = v1 + v2;
}

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

var v3 = closure1.v1 + v2;

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

(Func<int>)(() => v2);

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

Что действительно делает это жестким заданием для EE, хотя та последняя строка. Как та строка должна теперь быть выполнена? Во всех отношениях, анонимная функция удалила v2 переменную и заменила ее closure2.v2. Таким образом, последняя строка кода действительно теперь должна читать

var v3 = closure1.v1 + closure2.v2;

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

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

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

91
ответ дан Tim Schmelter 24 November 2019 в 05:47
поделиться

Лямбда-выражения не поддерживаются средством анализа выражения отладчика..., которое едва удивительно с тех пор во время компиляции, они используются для создания методов (или Деревья выражений), а не выражения (смотрите в Отражателе с дисплеем, переключенным на.NET 2 для наблюдения их).

Плюс, конечно, они могли сформировать закрытие, другой целый слой структуры.

2
ответ дан Richard 24 November 2019 в 05:47
поделиться

это может помочь: Расширенное непосредственное окно для Visual Studio (используйте Linq, Lambda Expr для отладки)

Всего наилучшего, Патрик

5
ответ дан 24 November 2019 в 05:47
поделиться

Вы не можете использовать лямбда-выражения в окнах Immediate или Watch.

Однако вы можете использовать System.Linq.Dynamic выражения , которые принимают форму .Where ("Id = @ 0", 2) - он не имеет полного набора методов, доступных в стандарте. Linq и не обладает всеми возможностями лямбда-выражений, но все же это лучше, чем ничего!

49
ответ дан 24 November 2019 в 05:47
поделиться
Другие вопросы по тегам:

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