Сбрасывает внутри запросов C # Linq - PullRequest
5 голосов
/ 25 апреля 2019

Интересно, подходит ли этот вариант для использования Discards в запросах Linq в соответствии с https://docs.microsoft.com/en-us/dotnet/csharp/discards,, например:

public bool HasRedProduct => Products.Any(_=>_.IsRed == true);

Какие плюсы / минусы вместо использования

public bool HasRedProduct => Products.Any(x=>x.IsRed == true);

Ответы [ 3 ]

14 голосов
/ 25 апреля 2019

Это не отбрасывание - это параметр лямбда-выражения, называемый _.Позже в статье речь пойдет о следующем:

Обратите внимание, что _ также является допустимым идентификатором.При использовании вне поддерживаемого контекста _ рассматривается не как сброс, а как допустимая переменная.

Вы можете сказать, что это не сброс, потому что его значение не отбрасывается - вы используете его в остальной части лямбда-выражения.Я бы настоятельно не рекомендовал бы использовать _ в качестве имени параметра лямбда-выражения, когда вы используете значение.Можно использовать _ в качестве имени параметра, когда вы хотите, чтобы отказался от него, даже если это технически не отказ с точки зрения языка.Имя _ было выбрано для отбрасывания именно потому, что оно уже использовалось на практике.

1 голос
/ 25 апреля 2019

Эти подчеркивания - это просто лямбда-параметры с именем _, как они сделали в C # 6. Они не отбрасываются.

Сбрасывает то, что введено в C # 7 в некоторых новых контекстах (например, из объявлений переменных) инекоторые существующие контексты (например, присваивание _ = expression;).В последнем случае интерпретация подчеркивания в C # 6, если таковая существует, выигрывает при соблюдении обратной совместимости.

Сброс - это переменные, которые вы можете назначать, но не можете читать из них.У них нет имен.Вместо этого они представлены символом «_» (подчеркивание).В C # 7.0 они могут появляться в следующих контекстах:

  • из объявлений переменных, таких как bool found = TryGetValue(out var _) или bool found = TryGetValue(out _)
  • назначения деконструкции, такие как (x, _) = deconstructable;
  • декларации деконструкции, такие как (var x, var _) = deconstructable;
  • - это шаблоны, такие как x is int _
  • шаблоны переключателей / регистров, такие как case int _:

Основное представление отбрасываний - это обозначение _ (подчеркивание) в выражении декларации.Например, int _ в объявлении переменной out или var (_, _, x) в объявлении деконструкции.

Второе представление отбрасываний использует выражение _ в качестве сокращения для var _, когда нетпеременная с именем _ находится в области видимости.Это разрешено в переменных, деконструкционных назначениях и декларациях и простых назначениях (_ = IgnoredReturn();).Это, однако, не разрешено в шаблонах C # 7.0.Если в области видимости существует переменная с именем _, то выражение _ является просто ссылкой на эту переменную, как это было в более ранних версиях C #.

https://github.com/dotnet/roslyn/blob/master/docs/features/discards.md

0 голосов
/ 25 апреля 2019

Отбрасывает, которые являются временными, фиктивными переменными, которые преднамеренно не используются в коде приложения. Сбросы эквивалентны неназначенным переменным; они не имеют значения. Поскольку существует только одна переменная сброса, и эта переменная может даже не быть выделена для хранения, отбрасывания могут уменьшить выделение памяти. Поскольку они проясняют цель вашего кода, они повышают его читабельность и удобство обслуживания.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...