Существует ли лучший способ выразить лямбду без параметров, чем () =>?

Используя эту функцию PHP mysql_escape_string(), вы можете быстро получить хорошую профилактику.

Например:

SELECT * FROM users WHERE name = '".mysql_escape_string($name_from_html_form)."'

mysql_escape_string - Сбрасывает строку для использования в mysql_query

Для большей профилактики вы можете добавить в конце ...

wHERE 1=1   or  LIMIT 1

Наконец вы получаете:

SELECT * FROM users WHERE name = '".mysql_escape_string($name_from_html_form)."' LIMIT 1
39
задан DaveShaw 10 May 2012 в 21:58
поделиться

4 ответа

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

Так как подчеркивание (" _ ") является допустимым идентификатором C#, это становится общей идиомой для использования его в качестве названия параметра к лямбде в случаях, где Вы планируете проигнорировать параметр так или иначе. Если другие кодеры будут знать об идиоме, то они будут сразу знать, что параметр не важен.

Например:

ExternalId.IfNotNullDo( _ => ExternalId=ExternalId.Trim());

Легкий ввести, передает Ваше намерение, и легче на глазах также.

Конечно, при передаче лямбды чему-то, что ожидает дерево выражений, это не может работать, потому что теперь Вы передаете лямбду с одним параметром вместо лямбды без параметров.

Но для многих случаев, это - хорошее решение.

43
ответ дан MyDaftQuestions 27 November 2019 в 02:25
поделиться

Для лямбды, нет: Вам нужно () =>

, он для делегата или выражения? Для делегатов другая опция delegate {...}. Это может или не может быть желательно, в зависимости от сценария. Это - больше ключей, конечно...

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

ExternalId.IfNotNullDo(SomeMethod);
23
ответ дан Marc Gravell 27 November 2019 в 02:25
поделиться

Нет, нет. Лямбда-выражения оптимизированы (с точки зрения синтаксиса) для единственного случая параметра.

я знаю, что команда C# чувствует Вашу боль и попыталась найти альтернативу. Будет ли когда-нибудь один или не другой разговор.

19
ответ дан Jon Skeet 27 November 2019 в 02:25
поделиться

По существу то, что Вы ищете, является инверсией ?? пустой оператор объединения (который называют Nullable<T>.GetValueOrDefault() под покрытиями) - проблемой является C#, не предоставляет аккуратный ответ OOTB.

не знают точно, что Вы делаете, но как Вы делаете:

ExternalId.IfNotNullDo(()=>ExternalId=ExternalId.Trim());

Вы могли бы также найти использование для:

class NullExtensions
{
    public T DefaultOr<T>( this T that, Func<T> transform)
    {
        return that!=default(T) ? transform(that) : default(T);
    }
}

, который включил бы:

var result = input.DefaultOr( _ => _.Trim());

(в целом, я попытался бы держаться далеко от многократного использования / видоизменяющиеся переменные, поскольку Вы, кажется, делаете и вместо этого входите в Представлять Объяснение Переменной / направление Временной переменной Разделения т.е. используете новую переменную, а не value = value.DefaultOr( _ => _.Trim());)

-1
ответ дан Ruben Bartelink 27 November 2019 в 02:25
поделиться
Другие вопросы по тегам:

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