Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException
вообще.
См. также: A хороший список лучших практик
Я бы добавил, очень важно, хорошо использовать модификатор final
. Использование "окончательной" модификатор, когда это применимо в Java
Сводка:
final
для обеспечения хорошей инициализации. @NotNull
и @Nullable
if("knownObject".equals(unknownObject)
valueOf()
поверх toString (). StringUtils
StringUtils.isEmpty(null)
. LINQ превращается в вызовы метода как код, который Вы имеете.
, Другими словами, не должно быть никакого различия.
Однако в Ваших двух частях кода Вы не называете.ToList в первом, таким образом, первая часть кода произведет счетный источник данных, но если Вы называете.ToList на нем, эти два должны быть тем же.
Как упомянуто d будет IEnumerable<MyProduct>
, в то время как f List<MyProduct>
, преобразование сделано компилятором C#
var d =
from mp in MyProducts
where mp.Price < 50d
select mp;
, преобразовывается в (прежде чем компиляция к IL и с расширенными дженериками):
var d =
MyProducts.
Where<MyProduct>( mp => mp.Price < 50d ).
Select<MyProduct>( mp => mp );
//note that this last select is optimised out if it makes no change
Примечание, что в этом простом случае это имеет мало значения. То, где Linq становится действительно ценным, находится в намного более сложных циклах.
, Например, этот оператор мог включать группу-bys, заказы и несколько операторов, которым позволяют, и все еще быть читаемым в формате Linq, когда эквивалент .Method().Method.Method()
быть сложным.
Кроме различия ToList, № 2 является намного большим количеством читаемого и естественного IMO
Синтаксис, который Вы используете для d, будет преобразован компилятором в тот же IL как дополнительные методы. "Подобный SQL" синтаксис, как предполагается, является более естественным способом представить выражение LINQ (хотя я лично предпочитаю дополнительные методы). Как был уже указан, первый пример возвратит результат IEnumerable, в то время как второй пример возвратит результат Списка из-за вызова в ToList (). Если Вы удалите ToList () вызов во втором примере, то они оба возвратят тот же результат как, Где возвраты IEnumerable заканчиваются.