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

() кажется глупым. есть лучший способ?

Например:

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

Ответ 1

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

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

Например:

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

Легко набирать, передает ваше намерение и легче на глаза.

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

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

Ответ 2

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

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

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

ExternalId.IfNotNullDo(SomeMethod);

Ответ 3

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

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

Ответ 4

По сути, вы ищете инверсию оператора ?? null coalescing (который называется Nullable<T>.GetValueOrDefault() под обложками) - проблема заключается в том, что С# не обеспечивает аккуратный ответ 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());

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