Можно ли объявить и запустить лямбда-функцию в выражении? - PullRequest
0 голосов
/ 28 мая 2020

Учитывая очень простое выражение, например:

var x = new Thing(); 

Я подумал, можете ли вы инкапсулировать new Thing как лямбду, например () => new Thing() inline, по строкам:

var x = () => new Thing();

Это не компилируется, потому что я пытаюсь назначить делегата x, а не результат его вызова.

Но когда я пытаюсь:

var x = (() => new Thing())(); //call my lambda in-line

Это тоже не ' t скомпилировать с ошибкой «Ожидается имя метода».

Означает ли это, что я не могу объявить и использовать встроенную лямбда-форму, или просто не понимаю синтаксис?

( Примечание: это вопрос о понимании языка, я не спрашиваю, стоит ли это делать, только если я могу. Мой пример явно чрезмерно упрощен для любого реального использования!)

1 Ответ

1 голос
/ 28 мая 2020

using дает вам границу вокруг IDisposable объектов. Как только вы покинете эту границу, объект будет уничтожен.

Например, возьмите эту строку

using (var connection = new SqlConnection(connectionString))

SqlConnection реализует IDisposable, поэтому, как только конец блока using достигается, вызывается метод удаления.

Теперь давайте посмотрим на ваш пример с лямбда -

using (var conn = (() => new SqlConnection(ConnectionString)))

В этом случае ваша переменная conn не является соединением, вместо этого это анонимный метод, который, конечно, не реализует IDisposable. Тип анонимного метода зависит от выражения инициализатора, а у вас его нет. Подробнее об этом чуть позже.

Для вашего второго примера,

using (var conn = (() => new SqlConnection(ConnectionString))())

Здесь я начинаю путаться в том, что вы пытаетесь выполнить sh. Я не могу сказать, как вы хотите, чтобы это было отличным от

using (var conn = new SqlConnection(ConnectionString))

Если вы абсолютно обязаны это сделать, вам, вероятно, придется обернуть его в Func

using (var conn = new Func<SqlConnection>(() => new SqlConnection(ConnectionString)).Invoke())

Но, опять же, я не уверен, зачем вам это нужно.

...