Тёмный

Анатолий Жмур - Пиши, как тиктокер, а не как дед. Новые конструкции языка C# в бою 

DotNext
Подписаться 20 тыс.
Просмотров 6 тыс.
50% 1

Ближайшая конференция - DotNext 2024, 10 - 11 сентября, Москва + online
Подробности и билеты: jrg.su/x2GKnA
- -
За 20 лет эволюции вышло много версий языка С#, постепенно набор конструкций расширялся. К сожалению, не многие могут охватить в голове это разнообразие и продолжают писать так, как «деды писали на Си». В докладе будет много примеров, как можно переписать старый код по-новому, и как не увлекаться этим делом.

Наука

Опубликовано:

 

3 авг 2023

Поделиться:

Ссылка:

Скачать:

Готовим ссылку...

Добавить в:

Мой плейлист
Посмотреть позже
Комментарии : 54   
@vadimn6393
@vadimn6393 9 месяцев назад
Спасибо! 1) obj is null отличается от obj == null тем что во втором случае оператор == может быть переопределен так что выражение может получить другой смысл 2) не понимаю, почему у докладчика "Nullable reference types" не взлетел. Я так наоборот не представляю как раньше без него жил. Смотришь на старый код как будто как на нетипизированный - неясно что может быть null, а что не может быть
@hello_world_zz
@hello_world_zz 5 месяцев назад
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
@chelmyaso
@chelmyaso 10 месяцев назад
is null и is not null добавили на случай наличия перегруженных операторов сравнения == и !=, когда есть необходимость проверки на null, но нет уверенности, что операторы сравнения обрабатывают null так, как нужно вам.
@anatolyzhmur1647
@anatolyzhmur1647 9 месяцев назад
Хорошо будет если вы приведете пример стандартного класса у которого есть такая перегрузка (кроме string). Реально никто не перегружает equality на классах (и даже вы в своих проектах :-) )
@DrollerTroller
@DrollerTroller 9 месяцев назад
​@@anatolyzhmur1647 каким прибором, показавшим вам «никто», вы измеряли? Готовы поручиться за миллиарды строк проприетарного кода веб приложений автоматизации бизнеса на аутсорсе? Есть спека языка, которая говорит, что «a == null - это не обязательно сравнение значений двух ссылок». Поэтому, если в коде хотели сравнить ссылки, а написали a == null - это в лучшем случае бомба замедленного действия, а в худшем - баг. Но нет. Вместо 100% работающего варианта, написание которого - секунды, мы предпочтём защититься «так никто не делает». А потом отлаживать код 3 дня. Саботаж какой-то: мы знаем, как писать; это занимает 0 времени; но напишем не так, чисто вот что бы что? Интересно, вы годовы летать на самолётах, при разработке которых инженеры руководствовались именно соображениями «в кабине всегда есть один пилот, который не засыпает» или «ой, да ладно, нагрузок ползучести не бывает выше X»?
@andyash3337
@andyash3337 8 месяцев назад
30:28 Какой-то странный "дед". Поскульку и IsInRange2(...), и IsInRange3(...) - оба не являются эквивалентами для изначального IsInRange(...), который учитывает ещё равенство проверяемого значения val, крайним значениям (left и right) диапазона :)))) А такой "дед", как я, написал бы следующее: private static bool IsInRange4(int val, int? left, int? right) { return (left ?? val)
@konstantinta2803
@konstantinta2803 9 месяцев назад
Новый switch пришёл из функциональщины, и думать про него надо, как про функциональщину: переменная-switch-предикаты. Чем-то он напоминает rust-овский match
@nzeemin
@nzeemin 9 месяцев назад
На 28:39 кажется пропущен слайд? жаль что нет нумерации слайдов
@Doctor.Livesey
@Doctor.Livesey 5 месяцев назад
17:45 А разве не может быть выставлен флаг Cancellation сразу после другого исключения, но до того как код будет передан блок catch?
@neitralov
@neitralov 10 месяцев назад
У меня наоборот было. Никак не мог запомнить старый синтаксис switch, а новый синтаксис прижился в моих проектах очень хорошо.
@ryanlashkevich9615
@ryanlashkevich9615 9 месяцев назад
У них и терминология изменилась, новая версия - switch expression, а дедовская - это, ясное дело, switch statement. Очень удобно, кстати.
@vasiliyk
@vasiliyk 8 месяцев назад
26:21 наглядней понятней надежней валидней и эффективней будет сделать через substring. Через трим вообще не сразу ясно что вы хотите сделать. При этом строка может содержать удаляемые вами символы. И через трим это медленней. И если запустите это в циклек при обработке данных с бд, то удачи. А ведь могут вашу функцию так и использовать...
@IvanenkoStepan
@IvanenkoStepan 10 месяцев назад
🔥
@user-wu5id5cx8v
@user-wu5id5cx8v 4 месяца назад
Удобнее использовать is операттр, потому что ты его часто юзаешь в sql) и не выбиваешься из контекста . Сократили миллисекунды на переключения между языками)
@alexandrdeveloper1242
@alexandrdeveloper1242 10 месяцев назад
Кто-нибудь может разъяснить за бородача почему 3-й вариант на 39:54 не работает? Что накрытил мелкософт с nullable монадой, что она стала работать не всегда?
@karbofos42
@karbofos42 10 месяцев назад
любое число одновременно и не больше и не меньше null. 10 null - это тоже false. Во втором варианте заход через инверсию идёт и там эта фигня с false прокатывает. В третьем варианте уже на любом null будет ошибка, т.к. null < 10 будет false, а нужен true, т.к. граница не закрыта и пойдёт любое значение.
@alexandrdeveloper1242
@alexandrdeveloper1242 10 месяцев назад
@@karbofos42 почему 10 < null это false понятно, но вот зачем было делать 10 > null и 10
@karbofos42
@karbofos42 10 месяцев назад
​@@alexandrdeveloper1242 null равен только null, любое сравнение числа с null вернёт false, так что 10 == null тоже false. Вполне логично сделали. Чтобы не было путаницы, тогда уже нужно было убирать возможность сравнения типов int? но его использование превратилось бы в боль.
@alexandrdeveloper1242
@alexandrdeveloper1242 10 месяцев назад
@@karbofos42 но 10 null даёт false. Значит возможно только три варианта: 1. У вас ошибка в первом сообщении 2. Либо 10 == null должно давать true 3. Либо сравнение с null всегда false, но тогда пример в видео не верен.
@karbofos42
@karbofos42 10 месяцев назад
@@alexandrdeveloper1242 сравнение с null даёт true только для null. Любое число выдаст false. Пример проще проверить на каких-то тестовых вариантах. Например, val = 10, а left и right = null. По задумке метода границы диапазона null означают, что любое число должно в него входить. left < val превращается в null < 10, т.е. false. Второе условие не проверяется даже. По левой границе диапазона получаем, что 10 не входит в диапазон, хотя по задумке должна была входить. Поэтому по втором примере используют инверсию и стоит left >= val, т.е. null >= 10, опять имеем false, но его дальше через ! инвертируем в true.
@pavelzagrebelin3092
@pavelzagrebelin3092 9 месяцев назад
На 14.38 автор зря стал мутить свитч по теплу, надо всего-то было инвертировать условие (if ! normalize return strValue) а остаток функции свести к предыдущему слайду.
@user-zk4dt2mu9f
@user-zk4dt2mu9f 7 месяцев назад
Оо, прекрасно, в комментариях повылезали обиженные дедки с подгоревшими жепами. За ролик спасибо 😊
@vitaliyvasiliev7854
@vitaliyvasiliev7854 10 месяцев назад
Отличная лекция, спасибо!
@bananasba
@bananasba 10 месяцев назад
Есть интересные примеры. Лично мне однострочные методы и похожие минималистичные фичи ухудшают восприятие, какая-то нездоровая тяга к минимализму.
@AShahabov
@AShahabov 10 месяцев назад
Немного звук плохой у спикера.
@igorcoolman
@igorcoolman 9 месяцев назад
я тоже с трудом разбираю его речь, не все разобрал.
@user-zl3zr8nc5x
@user-zl3zr8nc5x 4 месяца назад
ставьте лайк кто тоже дед 😂😂😂
@MaksimVolkau
@MaksimVolkau 10 месяцев назад
Отлично, всегда жду доклады А.Жмура и Седристого.
@xinitru
@xinitru 10 месяцев назад
Седристый пишется с буквой "и": Сидристый :)
@ryanlashkevich9615
@ryanlashkevich9615 8 месяцев назад
@@xinitru Иногда можно и через е, для профилактики. )
@vadim_b.
@vadim_b. 10 месяцев назад
Может делить не по придуманным примерам примерам дедовского кода, а по признаку того, знаешь ли ты, где есть аллокации, а где их нет? Пока вижу только уровень деццкого кода. А вообще, дремучая копипаста. В смысле заимствование контента.
@alexeykonovalenko6965
@alexeykonovalenko6965 10 месяцев назад
"дедовский" код читается быстрее и понятен даже тем разработчикам, кто не знаком с С#
@vadim_b.
@vadim_b. 10 месяцев назад
Очень кстати этот комментарий. Нужно помнить, что твой код может смотреть не только гуру современного C#. И нужно постоянное себе об этом напоминать, если делаешь общедоступную библиотеку. Как вариант - добавлять пояснительный комментарий в сложных местах. Или все же писать с if-ами. Но тогда особо заковыристые достижения сахара становятся сомнительны.
@vasiliyk
@vasiliyk 8 месяцев назад
Особенно если тебе надо кучу кода прочитать, сиди там разбирайся со вложенными тернаркиками, потому что кто-то решил что это клево
@user-wq2oq8st1u
@user-wq2oq8st1u 10 месяцев назад
Можно сколько угодно морщить носик от ифов, но такой код понять и поправить способен любой джун без опыта. А над подобными свичами этот джун будет медитировать по часу над каждым, в попытках понять что это такое и как оно работает. Особенно улыбает заявление, что если добавить код в ифы, то будет совсем плохо. Ну так во что превратится этот свич, если в нем будут не просто ретурны, а еще простыня кода?
@AlexanderRadchenko
@AlexanderRadchenko 10 месяцев назад
Очень многие расширения Шарпа сделаны по детски, как будто его бывшие разработчики Бейсика делают... Старые очевидные фишки ФиШарпа перетаскивают в ужасно урезаном виде. Зачем городить весь этот огород с новым свитчем если достаточно просто добавить возможность всех современных языков, что любой оператор в том числе if может возвращать последнее выражение как значение. Это огромный шаг в синтаксическом сахаре.
@user-wq2oq8st1u
@user-wq2oq8st1u 10 месяцев назад
@@AlexanderRadchenko у меня вообще ощущение складывается, что с 8 версии шарп пилят люди, которые на нем вообще не программируют, ну или программируют, но очень мало. Ничем другим я их инициативы объяснить не могу.
@ValueLevit
@ValueLevit 10 месяцев назад
странно, что дед не знаком с принципами проектирования и не предложил разделить ответственность и вынести метод для вложенных условий.
@karbofos42
@karbofos42 10 месяцев назад
ну, простыня кода и с if и со switch - это плохо и должно по максимуму всё выноситься в отдельные методы. Беда свичей на мелких доработках. Оно всё красиво однострочное выглядит, а потом начинается, что нужно логирование какое-нибудь добавить или просто очень длинная строка получается и хочется её разбить на несколько операций.
@gzipy
@gzipy 10 месяцев назад
Интересные примеры, однозначно, есть. А вот постоянный "дед" очень мешает. Почему нельзя просто рассказать без всякой шелухи?
@HelloWorld-ln5cy
@HelloWorld-ln5cy 10 месяцев назад
11:41 как по мне первый "дедовский" вариант самый понятный и практичный из перечисленных. А по моему субьективному мнению тернарник это кал.
@dmytroskryzhevskyi3032
@dmytroskryzhevskyi3032 10 месяцев назад
Понтов выше крыши. При всем при этом собственный код на гитхабе автор даже аккуратно оформить не может. В реальных проектах даже страшно представить что он городит.
@BelTube2012
@BelTube2012 10 месяцев назад
НА 42 20 у него еще и логическая ошибка - is ..Bind or ..Bond -
@karbofos42
@karbofos42 10 месяцев назад
@@BelTube2012 просто копипаста дала о себе знать)
@DrollerTroller
@DrollerTroller 9 месяцев назад
При всех, кхм, особенностях доклада, понтов я в нём не заметил ¯\_(ツ)_/¯
@roman4554
@roman4554 10 месяцев назад
Что за эйджизм, ты же сам когда-нибудь наберешь возраст. У тебя это в голове не складывается?
@alexandrdeveloper1242
@alexandrdeveloper1242 10 месяцев назад
Здесь не в эйджизме дело. Я "дед" и я бы от этого бородатого сбежал не за эйджизм (а скорее всего он бы у меня правил мои "токсичные" коменты в пуле 😁) Просто некоторые примеры, которые он предлагает, делают хуже, а не лучше. Новое в языках - отлично. Но вот за код на 28:23 я бы 3.14здил, потому что "инверсная" логика (NotIsNull вместо isNull) - это прямой путь в адЪ. И пофиг что там мелкомягкие напридумывали (может поэтому главной в бизнес-программировании остаётся Java. А если не для бизнес-систем, то для чего ещё шарпы? Игрули можно и на сях писать под анреал 😂) Так шо, да, "дед" не одобряет, но не потому что всё новое плохо, а потому, что не всё новое хорошо.
@alexandrdeveloper1242
@alexandrdeveloper1242 10 месяцев назад
Дальше смотрю... На 29:55 - ну да, за такое отправил бы переписать. Но не так как борода показал. Кто мешает создать два отдельных метода которые проверяют наличие символа в конце строки и в начале? Назвать isStartChar и isEndChar (если мелкомягкие об этом не позаботились ещё...) и код в примере внезапно приобретет читаемость без всяких вывертов. Бородач то ли неудачно примеры подбирает, то ли сам не догадывается...
@nikolaifedorov685
@nikolaifedorov685 8 месяцев назад
Так автор сам дед, этот как негр может говорить "негр"
@9285550
@9285550 9 месяцев назад
Хех, у дедов припекает) Хороший доклад. Уже полтора года пишу на го после нескольких лет шарпа и каждый день плююсь. Всё-таки шарп очень выразительный язык.
Далее
CSRF (доска)
9:52
Просмотров 9 тыс.
AI от Apple - ОБЪЯСНЯЕМ
24:19
Просмотров 128 тыс.
AI от Apple - ОБЪЯСНЯЕМ
24:19
Просмотров 128 тыс.