Comments 26
Это очень клёвая фича. Представьте, что у вас есть некое свойство A
, у которого есть свойство B
, у которого есть свойство C
, у которого есть свойство D
, у которого вы хотите вызвать метод Foo
. Но вот проблема: по пути к методу Foo
одно из свойств A
, B
, C
, D
может оказаться равным null
. Раньше приходилось писать:
if (A != null && A.B != null && A.B.C != null && A.B.C.D != null)
A.B.C.D.Foo();
В C#6 вы можете написать просто
A?.B?.C?.D?.Foo();
Материал для дополнительного чтения:
Ну а если мой коммент соберет 10 лайков, то я попрошу Джесси не рассказывать про оператор проверки на null" на кейноуте :)
А если серьезно, то есть много девелоперов, которые не особо следят за прогрессом и им это может быть полезно.
Представьте, что у вас есть некое свойство A, у которого есть свойство B, у которого есть свойство C, у которого есть свойство D, у которого вы хотите вызвать метод Foo.
Минутку, а как же закон Деметры?
Увы, законы реальной жизни оказываются сильнее, такой код систематически появляется в совершенно разных проектах.
Но даже если бы не появлялся, то
A?.Foo();
всё равно выглядит лаконичнее, чем какое-нибудь
if (A != null)
{
A.Foo();
}
Если фича хорошая, то она часто появляется сразу в нескольких хороших языках программирования. А null propagation operator — хорошая фича, поэтому мы можем её наблюдать не только в C#6 и Kotlin, но ещё и в Groovy. =)
Да не пытаюсь я Груви обидеть, не волнуйся так. =) Чудный язык, в нём очень давно появилось много разного и хорошего, с этим никто не спорит. Я просто хотел сказать, что это абсолютно нормально, когда хорошие фичи переходят из одних языков в другие.
По фичам 7ого шарпа можно просто отслеживать эту доку https://github.com/dotnet/roslyn/blob/master/docs/Language%20Feature%20Status.md весь процесс разработки и обсуждения розлина давольно открытый для сообщества.
@PsyHaSTe, направление мысли правильное. А можно что-нибудь сделать без модификации входных данных? Другими словами, нужно написать собственную функцию Sum
, которая для любого набора чисел выдаст «хорошую» сумму.
Нет, предположения о порядке мы не делаем. Нам просто приходит набор double-чисел, нужно вернуть сумму.
Сортировка — мысль интересная, но не очень хорошая в плане производительности, сумма будет работать долго.
Можно ли что-нибудь придумать для произвольных входных данных, чтобы работало за O(N)
?
static class Extensions
{
public static double SumRight(this IEnumerable<double> list)
{
return Decimal.ToDouble(
list.Select(i => new Decimal(i)).Sum());
}
}
DotNext 2016 Moscow: 8 MVP, StackOverflow и немного хардкора