Когда event.getSource() == bin
истинно, ни один из вложенных операторов if не может быть истинным: if(event.getSource() == n1){
Также этот if всегда будет истинным, поскольку оператор присваивания pass = 1; if(pass == 1){
Единственное отличие состоит в том, что во втором сценарии вы закрываете переменную e
, которая эффективно перемещает переменную стека e
в настраиваемый тип, который перемещается в кучу, поэтому вы не потеряете его.
Я думаю, это должно работать нормально.
Edit: Что касается производительности, нет, не должно быть значительной разницы между двумя сценариями. В сценарии 1 вы уже передаете исключение как состояние
методу QueueUserWorkItem
, который внутренне перемещает ссылку на исключение в кучу. Единственные накладные расходы заключаются в том, что при использовании замыкания компилятор создает для вас тип и сохраняет любые захваченные переменные как поля этого типа.
Just to note, instead of the Lambda, you could do the same with an anonymous method, and it would also work in C# 2.0:
ThreadPool.QueueUserWorkItem(delegate(Object e)
{
Logger.Log(e as Exception);
});