Я не думаю, что это особенно хорошая идея, потому что это также позволило бы нам написать
var conn = new SqlConnecction("");
conn.Using(c => /* do something with c */);
conn.Open();
Это будет компилироваться, но когда вы достигнете В последней строке будет выброшено исключение ObjectDisposedException.
В любом случае, идиома кодирования с использованием
хорошо известна, так зачем же усложнять другим разработчикам чтение вашего кода?
Вам не нужно два клона, один сделает. Взяв Паоло Бергантино ответ у нас есть:
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 } )));
Немного грубо, честно говоря.
Одно ограничение: вы не можете получить доступ к параметрам содержащего метода в вашей лямбде.
Некоторые причины, по которым я предпочитаю не использовать это.
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 достаточно умен, чтобы распознать, когда его целью является структура во время компиляции, и отказаться от бокса.
Оператор using
проверяет, является ли одноразовым
значением null
. В остальном во время выполнения вы получите в основном такое же поведение (кроме дополнительного кадра стека и вызова делегата).
Как сказал Ричард, есть дополнительный вызов метода между созданием одноразового предмета и началом попытки. Это увеличивает время, в течение которого может произойти асинхронное исключение, что приводит к тому, что ваш одноразовый объект не будет утилизирован. Однако, это не большая проблема, так как типы, реализующие IDisposable, не должны приобретать свои ресурсы в конструкторе (SqlConnection приобретает свои ресурсы при вызове метода Open()).
Таким образом, в то время как ваш новый способ написания выражения use будет работать, он значительно усложняет чтение для других разработчиков и может быть легко воспринят как заметки Марка Симанна.
Итак, можете ли вы заменить ключевое слово use на ваш метод use extension? Да. Должны ли вы это сделать? Нет.
Это почти функционально эквивалентно, но практически не дает никаких преимуществ. Семантика "традиционного" утверждения с использованием
хорошо известна и является стандартной. Хотя Ваш подход может вести себя так же (хотя и с некоторыми отличиями), он вносит ненужные накладные расходы и сложность - у Вас не только есть дополнительные вызовы методов, которые Вы сами реплицируете код, который компилятор автоматически сгенерирует.
No. Вы понижаете ключевое слово языка [что означает, что компилятор может что-то делать вокруг него, как указал Флориан] до обычного вызова метода.
Хотя семантически они могут быть одинаковыми, компилятор не будет знать, что будет делать метод. Проверки времени компиляции, как мы все знаем, лучше, чем исключения во время выполнения.