Анатолий Жмур - Пиши, как тиктокер, а не как дед. Новые конструкции языка C# в бою
ฝัง
- เผยแพร่เมื่อ 5 ก.ย. 2024
- Ближайшая конференция - DotNext 2024, 10 - 11 сентября, Москва + online
Подробности и билеты: jrg.su/x2GKnA
- -
За 20 лет эволюции вышло много версий языка С#, постепенно набор конструкций расширялся. К сожалению, не многие могут охватить в голове это разнообразие и продолжают писать так, как «деды писали на Си». В докладе будет много примеров, как можно переписать старый код по-новому, и как не увлекаться этим делом.
Спасибо!
1) obj is null отличается от obj == null тем что во втором случае оператор == может быть переопределен так что выражение может получить другой смысл
2) не понимаю, почему у докладчика "Nullable reference types" не взлетел. Я так наоборот не представляю как раньше без него жил. Смотришь на старый код как будто как на нетипизированный - неясно что может быть null, а что не может быть
Intro 0:00
Null coalescing 10:30
Switch Expression 12:00
Switch Expression and Surrogate tuple 14:20
Catch When 16:10
Query syntax 18:10
Raw String Literals 19:57
AsSpan vs string allocations 23:36
Is operator 27:35
Slices 28:53
Dictionary CollectionsMarshal 31:00
Value Type Array Iterate And Change 32:25
Using dynamic instead of is 34:14
Increment Nullable Using Lifted Operator 37:23
Switch with Predicate 40:13
Lightweight types 42:25
Using Caller Member Name 44:30
Type Deconstruction 45:40
Copy Immutable and Change By With 48:40
is null и is not null добавили на случай наличия перегруженных операторов сравнения == и !=, когда есть необходимость проверки на null, но нет уверенности, что операторы сравнения обрабатывают null так, как нужно вам.
Хорошо будет если вы приведете пример стандартного класса у которого есть такая перегрузка (кроме string). Реально никто не перегружает equality на классах (и даже вы в своих проектах :-) )
@@anatolyzhmur1647 каким прибором, показавшим вам «никто», вы измеряли? Готовы поручиться за миллиарды строк проприетарного кода веб приложений автоматизации бизнеса на аутсорсе?
Есть спека языка, которая говорит, что «a == null - это не обязательно сравнение значений двух ссылок». Поэтому, если в коде хотели сравнить ссылки, а написали a == null - это в лучшем случае бомба замедленного действия, а в худшем - баг.
Но нет. Вместо 100% работающего варианта, написание которого - секунды, мы предпочтём защититься «так никто не делает». А потом отлаживать код 3 дня. Саботаж какой-то: мы знаем, как писать; это занимает 0 времени; но напишем не так, чисто вот что бы что?
Интересно, вы годовы летать на самолётах, при разработке которых инженеры руководствовались именно соображениями «в кабине всегда есть один пилот, который не засыпает» или «ой, да ладно, нагрузок ползучести не бывает выше X»?
30:28 Какой-то странный "дед". Поскульку и IsInRange2(...), и IsInRange3(...) - оба не являются эквивалентами для изначального IsInRange(...), который учитывает ещё равенство проверяемого значения val, крайним значениям (left и right) диапазона :))))
А такой "дед", как я, написал бы следующее:
private static bool IsInRange4(int val, int? left, int? right)
{
return (left ?? val)
На 14.38 автор зря стал мутить свитч по теплу, надо всего-то было инвертировать условие (if ! normalize return strValue) а остаток функции свести к предыдущему слайду.
Новый switch пришёл из функциональщины, и думать про него надо, как про функциональщину: переменная-switch-предикаты. Чем-то он напоминает rust-овский match
У меня наоборот было. Никак не мог запомнить старый синтаксис switch, а новый синтаксис прижился в моих проектах очень хорошо.
У них и терминология изменилась, новая версия - switch expression, а дедовская - это, ясное дело, switch statement. Очень удобно, кстати.
26:21 наглядней понятней надежней валидней и эффективней будет сделать через substring.
Через трим вообще не сразу ясно что вы хотите сделать. При этом строка может содержать удаляемые вами символы. И через трим это медленней. И если запустите это в циклек при обработке данных с бд, то удачи. А ведь могут вашу функцию так и использовать...
Есть интересные примеры. Лично мне однострочные методы и похожие минималистичные фичи ухудшают восприятие, какая-то нездоровая тяга к минимализму.
На 28:39 кажется пропущен слайд? жаль что нет нумерации слайдов
Удобнее использовать is операттр, потому что ты его часто юзаешь в sql) и не выбиваешься из контекста .
Сократили миллисекунды на переключения между языками)
17:45 А разве не может быть выставлен флаг Cancellation сразу после другого исключения, но до того как код будет передан блок catch?
Хех, у дедов припекает) Хороший доклад. Уже полтора года пишу на го после нескольких лет шарпа и каждый день плююсь. Всё-таки шарп очень выразительный язык.
Отличная лекция, спасибо!
Отлично, всегда жду доклады А.Жмура и Седристого.
Седристый пишется с буквой "и": Сидристый :)
@@xinitru Иногда можно и через е, для профилактики. )
ставьте лайк кто тоже дед 😂😂😂
Немного звук плохой у спикера.
я тоже с трудом разбираю его речь, не все разобрал.
"дедовский" код читается быстрее и понятен даже тем разработчикам, кто не знаком с С#
Очень кстати этот комментарий. Нужно помнить, что твой код может смотреть не только гуру современного C#. И нужно постоянное себе об этом напоминать, если делаешь общедоступную библиотеку. Как вариант - добавлять пояснительный комментарий в сложных местах. Или все же писать с if-ами. Но тогда особо заковыристые достижения сахара становятся сомнительны.
Особенно если тебе надо кучу кода прочитать, сиди там разбирайся со вложенными тернаркиками, потому что кто-то решил что это клево
Кто-нибудь может разъяснить за бородача почему 3-й вариант на 39:54 не работает? Что накрытил мелкософт с nullable монадой, что она стала работать не всегда?
любое число одновременно и не больше и не меньше null. 10 null - это тоже false. Во втором варианте заход через инверсию идёт и там эта фигня с false прокатывает. В третьем варианте уже на любом null будет ошибка, т.к. null < 10 будет false, а нужен true, т.к. граница не закрыта и пойдёт любое значение.
@@karbofos42 почему 10 < null это false понятно, но вот зачем было делать 10 > null и 10
@@alexandrdeveloper1242 null равен только null, любое сравнение числа с null вернёт false, так что 10 == null тоже false. Вполне логично сделали. Чтобы не было путаницы, тогда уже нужно было убирать возможность сравнения типов int? но его использование превратилось бы в боль.
@@karbofos42 но 10 null даёт false. Значит возможно только три варианта:
1. У вас ошибка в первом сообщении
2. Либо 10 == null должно давать true
3. Либо сравнение с null всегда false, но тогда пример в видео не верен.
@@alexandrdeveloper1242 сравнение с null даёт true только для null. Любое число выдаст false. Пример проще проверить на каких-то тестовых вариантах. Например, val = 10, а left и right = null. По задумке метода границы диапазона null означают, что любое число должно в него входить. left < val превращается в null < 10, т.е. false. Второе условие не проверяется даже. По левой границе диапазона получаем, что 10 не входит в диапазон, хотя по задумке должна была входить. Поэтому по втором примере используют инверсию и стоит left >= val, т.е. null >= 10, опять имеем false, но его дальше через ! инвертируем в true.
Интересные примеры, однозначно, есть. А вот постоянный "дед" очень мешает. Почему нельзя просто рассказать без всякой шелухи?
🔥
Можно сколько угодно морщить носик от ифов, но такой код понять и поправить способен любой джун без опыта. А над подобными свичами этот джун будет медитировать по часу над каждым, в попытках понять что это такое и как оно работает.
Особенно улыбает заявление, что если добавить код в ифы, то будет совсем плохо. Ну так во что превратится этот свич, если в нем будут не просто ретурны, а еще простыня кода?
Очень многие расширения Шарпа сделаны по детски, как будто его бывшие разработчики Бейсика делают...
Старые очевидные фишки ФиШарпа перетаскивают в ужасно урезаном виде.
Зачем городить весь этот огород с новым свитчем если достаточно просто добавить возможность всех современных языков, что любой оператор в том числе if может возвращать последнее выражение как значение. Это огромный шаг в синтаксическом сахаре.
@@AlexanderRadchenko у меня вообще ощущение складывается, что с 8 версии шарп пилят люди, которые на нем вообще не программируют, ну или программируют, но очень мало.
Ничем другим я их инициативы объяснить не могу.
странно, что дед не знаком с принципами проектирования и не предложил разделить ответственность и вынести метод для вложенных условий.
ну, простыня кода и с if и со switch - это плохо и должно по максимуму всё выноситься в отдельные методы. Беда свичей на мелких доработках. Оно всё красиво однострочное выглядит, а потом начинается, что нужно логирование какое-нибудь добавить или просто очень длинная строка получается и хочется её разбить на несколько операций.
Может делить не по придуманным примерам примерам дедовского кода, а по признаку того, знаешь ли ты, где есть аллокации, а где их нет? Пока вижу только уровень деццкого кода. А вообще, дремучая копипаста. В смысле заимствование контента.
Понтов выше крыши. При всем при этом собственный код на гитхабе автор даже аккуратно оформить не может. В реальных проектах даже страшно представить что он городит.
НА 42 20 у него еще и логическая ошибка - is ..Bind or ..Bond -
@@BelTube2012 просто копипаста дала о себе знать)
При всех, кхм, особенностях доклада, понтов я в нём не заметил ¯\_(ツ)_/¯
Оо, прекрасно, в комментариях повылезали обиженные дедки с подгоревшими жепами.
За ролик спасибо 😊
Что за эйджизм, ты же сам когда-нибудь наберешь возраст. У тебя это в голове не складывается?
Здесь не в эйджизме дело. Я "дед" и я бы от этого бородатого сбежал не за эйджизм (а скорее всего он бы у меня правил мои "токсичные" коменты в пуле 😁) Просто некоторые примеры, которые он предлагает, делают хуже, а не лучше. Новое в языках - отлично. Но вот за код на 28:23 я бы 3.14здил, потому что "инверсная" логика (NotIsNull вместо isNull) - это прямой путь в адЪ. И пофиг что там мелкомягкие напридумывали (может поэтому главной в бизнес-программировании остаётся Java. А если не для бизнес-систем, то для чего ещё шарпы? Игрули можно и на сях писать под анреал 😂) Так шо, да, "дед" не одобряет, но не потому что всё новое плохо, а потому, что не всё новое хорошо.
Дальше смотрю... На 29:55 - ну да, за такое отправил бы переписать. Но не так как борода показал. Кто мешает создать два отдельных метода которые проверяют наличие символа в конце строки и в начале? Назвать isStartChar и isEndChar (если мелкомягкие об этом не позаботились ещё...) и код в примере внезапно приобретет читаемость без всяких вывертов. Бородач то ли неудачно примеры подбирает, то ли сам не догадывается...
Так автор сам дед, этот как негр может говорить "негр"
11:41 как по мне первый "дедовский" вариант самый понятный и практичный из перечисленных. А по моему субьективному мнению тернарник это кал.