Используя по сравнению с [закрытой] лямбдой

14
задан casperOne 5 April 2012 в 15:01
поделиться

8 ответов

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

var conn = new SqlConnecction("");
conn.Using(c => /* do something with c */);
conn.Open();

Это будет компилироваться, но когда вы достигнете В последней строке будет выброшено исключение ObjectDisposedException.

В любом случае, идиома кодирования с использованием хорошо известна, так зачем же усложнять другим разработчикам чтение вашего кода?

19
ответ дан 1 December 2019 в 07:27
поделиться

Вам не нужно два клона, один сделает. Взяв Паоло Бергантино ответ у нас есть:

jQuery.fn.swapWith = function(to) {
    return this.each(function() {
        var copy_to = $(to).clone(true);
        $(to).replaceWith(this);
        $(this).replaceWith(copy_to);
    });
};

Должно быть быстрее. Прохождение в меньшем из двух элементов также должно ускорить процесс.

-121--651206-

Попробуйте использовать этот проект с открытым исходным кодом для ASP.NET. Он расширяет GridView для обеспечения фиксированного верхнего и нижнего колонтитулов и пейджера, а также для изменения ширины столбца. Хорошо работает в IE 6/7/8, Firefox 3.0/3.5, Chrome и Safari.

http://johnsobrepena.blogspot.com/2009/09/extending-aspnet-gridview-for-fixed.html

-121--3147958-

Отмечу, что метод не делает всего , что делает оператор «using». Например, он не вводит новое пространство объявления локальной переменной, в котором может быть объявлена переменная, удерживаемая ресурсом.

Также не допускается объявление нескольких одноразовых ресурсов одного и того же типа за один раз.

И, наконец, он не кажется особенно элегантным с собой. Одна из приятных вещей об «использовании» в качестве заявления заключается в том, что вы можете сказать:

using(something)
using(someotherthing)
using(somethirdthing)
{
   use all three, they'll all get disposed
}

Как бы это выглядело в вашем предложении?

something.Using(
x=>someotherthing.Using(
y=>somethirdthing.Using(
z=> { use all three } )));

Немного грубо, честно говоря.

10
ответ дан 1 December 2019 в 07:27
поделиться

Одно ограничение: вы не можете получить доступ к параметрам содержащего метода в вашей лямбде.

2
ответ дан 1 December 2019 в 07:27
поделиться

Некоторые причины, по которым я предпочитаю не использовать это.

Compile-Time foolproofing

using (var foo=new Bar())
{
  foo=new Bar();// throws an error at compile time
}

Structs implementation IDisposable

Structs implementation interface is boxed when an interface method is invoked on them. Оператор use достаточно умен, чтобы распознать, когда его целью является структура во время компиляции, и отказаться от бокса.

2
ответ дан 1 December 2019 в 07:27
поделиться

Оператор using проверяет, является ли одноразовым значением null . В остальном во время выполнения вы получите в основном такое же поведение (кроме дополнительного кадра стека и вызова делегата).

2
ответ дан 1 December 2019 в 07:27
поделиться

Как сказал Ричард, есть дополнительный вызов метода между созданием одноразового предмета и началом попытки. Это увеличивает время, в течение которого может произойти асинхронное исключение, что приводит к тому, что ваш одноразовый объект не будет утилизирован. Однако, это не большая проблема, так как типы, реализующие IDisposable, не должны приобретать свои ресурсы в конструкторе (SqlConnection приобретает свои ресурсы при вызове метода Open()).

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

Итак, можете ли вы заменить ключевое слово use на ваш метод use extension? Да. Должны ли вы это сделать? Нет.

1
ответ дан 1 December 2019 в 07:27
поделиться

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

0
ответ дан 1 December 2019 в 07:27
поделиться

No. Вы понижаете ключевое слово языка [что означает, что компилятор может что-то делать вокруг него, как указал Флориан] до обычного вызова метода.

Хотя семантически они могут быть одинаковыми, компилятор не будет знать, что будет делать метод. Проверки времени компиляции, как мы все знаем, лучше, чем исключения во время выполнения.

0
ответ дан 1 December 2019 в 07:27
поделиться
Другие вопросы по тегам:

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