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

แชร์
ฝัง
  • เผยแพร่เมื่อ 5 ก.ย. 2024
  • Ближайшая конференция - DotNext 2024, 10 - 11 сентября, Москва + online
    Подробности и билеты: jrg.su/x2GKnA
    - -
    За 20 лет эволюции вышло много версий языка С#, постепенно набор конструкций расширялся. К сожалению, не многие могут охватить в голове это разнообразие и продолжают писать так, как «деды писали на Си». В докладе будет много примеров, как можно переписать старый код по-новому, и как не увлекаться этим делом.

ความคิดเห็น • 54

  • @vadimn6393
    @vadimn6393 11 หลายเดือนก่อน +8

    Спасибо!
    1) obj is null отличается от obj == null тем что во втором случае оператор == может быть переопределен так что выражение может получить другой смысл
    2) не понимаю, почему у докладчика "Nullable reference types" не взлетел. Я так наоборот не представляю как раньше без него жил. Смотришь на старый код как будто как на нетипизированный - неясно что может быть null, а что не может быть

  • @hello_world_zz
    @hello_world_zz 7 หลายเดือนก่อน +2

    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 ปีที่แล้ว +8

    is null и is not null добавили на случай наличия перегруженных операторов сравнения == и !=, когда есть необходимость проверки на null, но нет уверенности, что операторы сравнения обрабатывают null так, как нужно вам.

    • @anatolyzhmur1647
      @anatolyzhmur1647 ปีที่แล้ว

      Хорошо будет если вы приведете пример стандартного класса у которого есть такая перегрузка (кроме string). Реально никто не перегружает equality на классах (и даже вы в своих проектах :-) )

    • @DrollerTroller
      @DrollerTroller ปีที่แล้ว

      ​@@anatolyzhmur1647 каким прибором, показавшим вам «никто», вы измеряли? Готовы поручиться за миллиарды строк проприетарного кода веб приложений автоматизации бизнеса на аутсорсе?
      Есть спека языка, которая говорит, что «a == null - это не обязательно сравнение значений двух ссылок». Поэтому, если в коде хотели сравнить ссылки, а написали a == null - это в лучшем случае бомба замедленного действия, а в худшем - баг.
      Но нет. Вместо 100% работающего варианта, написание которого - секунды, мы предпочтём защититься «так никто не делает». А потом отлаживать код 3 дня. Саботаж какой-то: мы знаем, как писать; это занимает 0 времени; но напишем не так, чисто вот что бы что?
      Интересно, вы годовы летать на самолётах, при разработке которых инженеры руководствовались именно соображениями «в кабине всегда есть один пилот, который не засыпает» или «ой, да ладно, нагрузок ползучести не бывает выше X»?

  • @andyash3337
    @andyash3337 10 หลายเดือนก่อน +2

    30:28 Какой-то странный "дед". Поскульку и IsInRange2(...), и IsInRange3(...) - оба не являются эквивалентами для изначального IsInRange(...), который учитывает ещё равенство проверяемого значения val, крайним значениям (left и right) диапазона :))))
    А такой "дед", как я, написал бы следующее:
    private static bool IsInRange4(int val, int? left, int? right)
    {
    return (left ?? val)

  • @pavelzagrebelin3092
    @pavelzagrebelin3092 11 หลายเดือนก่อน +1

    На 14.38 автор зря стал мутить свитч по теплу, надо всего-то было инвертировать условие (if ! normalize return strValue) а остаток функции свести к предыдущему слайду.

  • @konstantinta2803
    @konstantinta2803 ปีที่แล้ว +1

    Новый switch пришёл из функциональщины, и думать про него надо, как про функциональщину: переменная-switch-предикаты. Чем-то он напоминает rust-овский match

  • @neitralov
    @neitralov ปีที่แล้ว +1

    У меня наоборот было. Никак не мог запомнить старый синтаксис switch, а новый синтаксис прижился в моих проектах очень хорошо.

    • @ryanlashkevich9615
      @ryanlashkevich9615 11 หลายเดือนก่อน

      У них и терминология изменилась, новая версия - switch expression, а дедовская - это, ясное дело, switch statement. Очень удобно, кстати.

  • @vasiliyk
    @vasiliyk 11 หลายเดือนก่อน

    26:21 наглядней понятней надежней валидней и эффективней будет сделать через substring.
    Через трим вообще не сразу ясно что вы хотите сделать. При этом строка может содержать удаляемые вами символы. И через трим это медленней. И если запустите это в циклек при обработке данных с бд, то удачи. А ведь могут вашу функцию так и использовать...

  • @bananasba
    @bananasba ปีที่แล้ว +7

    Есть интересные примеры. Лично мне однострочные методы и похожие минималистичные фичи ухудшают восприятие, какая-то нездоровая тяга к минимализму.

  • @nzeemin
    @nzeemin ปีที่แล้ว

    На 28:39 кажется пропущен слайд? жаль что нет нумерации слайдов

  • @user-wu5id5cx8v
    @user-wu5id5cx8v 6 หลายเดือนก่อน

    Удобнее использовать is операттр, потому что ты его часто юзаешь в sql) и не выбиваешься из контекста .
    Сократили миллисекунды на переключения между языками)

  • @Doctor.Livesey
    @Doctor.Livesey 8 หลายเดือนก่อน

    17:45 А разве не может быть выставлен флаг Cancellation сразу после другого исключения, но до того как код будет передан блок catch?

  • @9285550
    @9285550 11 หลายเดือนก่อน +1

    Хех, у дедов припекает) Хороший доклад. Уже полтора года пишу на го после нескольких лет шарпа и каждый день плююсь. Всё-таки шарп очень выразительный язык.

  • @vitaliyvasiliev7854
    @vitaliyvasiliev7854 ปีที่แล้ว +1

    Отличная лекция, спасибо!

  • @MaksimVolkau
    @MaksimVolkau ปีที่แล้ว +4

    Отлично, всегда жду доклады А.Жмура и Седристого.

    • @xinitru
      @xinitru ปีที่แล้ว

      Седристый пишется с буквой "и": Сидристый :)

    • @ryanlashkevich9615
      @ryanlashkevich9615 11 หลายเดือนก่อน

      @@xinitru Иногда можно и через е, для профилактики. )

  • @user-zl3zr8nc5x
    @user-zl3zr8nc5x 7 หลายเดือนก่อน

    ставьте лайк кто тоже дед 😂😂😂

  • @AShahabov
    @AShahabov ปีที่แล้ว +2

    Немного звук плохой у спикера.

    • @igorcoolman
      @igorcoolman 11 หลายเดือนก่อน

      я тоже с трудом разбираю его речь, не все разобрал.

  • @alexeykonovalenko6965
    @alexeykonovalenko6965 ปีที่แล้ว +5

    "дедовский" код читается быстрее и понятен даже тем разработчикам, кто не знаком с С#

    • @vadim_b.
      @vadim_b. ปีที่แล้ว +1

      Очень кстати этот комментарий. Нужно помнить, что твой код может смотреть не только гуру современного C#. И нужно постоянное себе об этом напоминать, если делаешь общедоступную библиотеку. Как вариант - добавлять пояснительный комментарий в сложных местах. Или все же писать с if-ами. Но тогда особо заковыристые достижения сахара становятся сомнительны.

    • @vasiliyk
      @vasiliyk 11 หลายเดือนก่อน

      Особенно если тебе надо кучу кода прочитать, сиди там разбирайся со вложенными тернаркиками, потому что кто-то решил что это клево

  • @alexandrdeveloper1242
    @alexandrdeveloper1242 ปีที่แล้ว

    Кто-нибудь может разъяснить за бородача почему 3-й вариант на 39:54 не работает? Что накрытил мелкософт с nullable монадой, что она стала работать не всегда?

    • @karbofos42
      @karbofos42 ปีที่แล้ว

      любое число одновременно и не больше и не меньше null. 10 null - это тоже false. Во втором варианте заход через инверсию идёт и там эта фигня с false прокатывает. В третьем варианте уже на любом null будет ошибка, т.к. null < 10 будет false, а нужен true, т.к. граница не закрыта и пойдёт любое значение.

    • @alexandrdeveloper1242
      @alexandrdeveloper1242 ปีที่แล้ว

      @@karbofos42 почему 10 < null это false понятно, но вот зачем было делать 10 > null и 10

    • @karbofos42
      @karbofos42 ปีที่แล้ว

      ​@@alexandrdeveloper1242 null равен только null, любое сравнение числа с null вернёт false, так что 10 == null тоже false. Вполне логично сделали. Чтобы не было путаницы, тогда уже нужно было убирать возможность сравнения типов int? но его использование превратилось бы в боль.

    • @alexandrdeveloper1242
      @alexandrdeveloper1242 ปีที่แล้ว

      @@karbofos42 но 10 null даёт false. Значит возможно только три варианта:
      1. У вас ошибка в первом сообщении
      2. Либо 10 == null должно давать true
      3. Либо сравнение с null всегда false, но тогда пример в видео не верен.

    • @karbofos42
      @karbofos42 ปีที่แล้ว

      @@alexandrdeveloper1242 сравнение с null даёт true только для null. Любое число выдаст false. Пример проще проверить на каких-то тестовых вариантах. Например, val = 10, а left и right = null. По задумке метода границы диапазона null означают, что любое число должно в него входить. left < val превращается в null < 10, т.е. false. Второе условие не проверяется даже. По левой границе диапазона получаем, что 10 не входит в диапазон, хотя по задумке должна была входить. Поэтому по втором примере используют инверсию и стоит left >= val, т.е. null >= 10, опять имеем false, но его дальше через ! инвертируем в true.

  • @gzipy
    @gzipy ปีที่แล้ว +5

    Интересные примеры, однозначно, есть. А вот постоянный "дед" очень мешает. Почему нельзя просто рассказать без всякой шелухи?

  • @IvanenkoStepan
    @IvanenkoStepan ปีที่แล้ว

    🔥

  • @user-wq2oq8st1u
    @user-wq2oq8st1u ปีที่แล้ว +8

    Можно сколько угодно морщить носик от ифов, но такой код понять и поправить способен любой джун без опыта. А над подобными свичами этот джун будет медитировать по часу над каждым, в попытках понять что это такое и как оно работает.
    Особенно улыбает заявление, что если добавить код в ифы, то будет совсем плохо. Ну так во что превратится этот свич, если в нем будут не просто ретурны, а еще простыня кода?

    • @AlexanderRadchenko
      @AlexanderRadchenko ปีที่แล้ว +2

      Очень многие расширения Шарпа сделаны по детски, как будто его бывшие разработчики Бейсика делают...
      Старые очевидные фишки ФиШарпа перетаскивают в ужасно урезаном виде.
      Зачем городить весь этот огород с новым свитчем если достаточно просто добавить возможность всех современных языков, что любой оператор в том числе if может возвращать последнее выражение как значение. Это огромный шаг в синтаксическом сахаре.

    • @user-wq2oq8st1u
      @user-wq2oq8st1u ปีที่แล้ว

      @@AlexanderRadchenko у меня вообще ощущение складывается, что с 8 версии шарп пилят люди, которые на нем вообще не программируют, ну или программируют, но очень мало.
      Ничем другим я их инициативы объяснить не могу.

    • @ValueLevit
      @ValueLevit ปีที่แล้ว

      странно, что дед не знаком с принципами проектирования и не предложил разделить ответственность и вынести метод для вложенных условий.

    • @karbofos42
      @karbofos42 ปีที่แล้ว

      ну, простыня кода и с if и со switch - это плохо и должно по максимуму всё выноситься в отдельные методы. Беда свичей на мелких доработках. Оно всё красиво однострочное выглядит, а потом начинается, что нужно логирование какое-нибудь добавить или просто очень длинная строка получается и хочется её разбить на несколько операций.

  • @vadim_b.
    @vadim_b. ปีที่แล้ว

    Может делить не по придуманным примерам примерам дедовского кода, а по признаку того, знаешь ли ты, где есть аллокации, а где их нет? Пока вижу только уровень деццкого кода. А вообще, дремучая копипаста. В смысле заимствование контента.

  • @dmytroskryzhevskyi3032
    @dmytroskryzhevskyi3032 ปีที่แล้ว +10

    Понтов выше крыши. При всем при этом собственный код на гитхабе автор даже аккуратно оформить не может. В реальных проектах даже страшно представить что он городит.

    • @BelTube2012
      @BelTube2012 ปีที่แล้ว +1

      НА 42 20 у него еще и логическая ошибка - is ..Bind or ..Bond -

    • @karbofos42
      @karbofos42 ปีที่แล้ว

      @@BelTube2012 просто копипаста дала о себе знать)

    • @DrollerTroller
      @DrollerTroller ปีที่แล้ว +2

      При всех, кхм, особенностях доклада, понтов я в нём не заметил ¯\_(ツ)_/¯

  • @user-zk4dt2mu9f
    @user-zk4dt2mu9f 9 หลายเดือนก่อน

    Оо, прекрасно, в комментариях повылезали обиженные дедки с подгоревшими жепами.
    За ролик спасибо 😊

  • @roman4554
    @roman4554 ปีที่แล้ว +3

    Что за эйджизм, ты же сам когда-нибудь наберешь возраст. У тебя это в голове не складывается?

    • @alexandrdeveloper1242
      @alexandrdeveloper1242 ปีที่แล้ว +1

      Здесь не в эйджизме дело. Я "дед" и я бы от этого бородатого сбежал не за эйджизм (а скорее всего он бы у меня правил мои "токсичные" коменты в пуле 😁) Просто некоторые примеры, которые он предлагает, делают хуже, а не лучше. Новое в языках - отлично. Но вот за код на 28:23 я бы 3.14здил, потому что "инверсная" логика (NotIsNull вместо isNull) - это прямой путь в адЪ. И пофиг что там мелкомягкие напридумывали (может поэтому главной в бизнес-программировании остаётся Java. А если не для бизнес-систем, то для чего ещё шарпы? Игрули можно и на сях писать под анреал 😂) Так шо, да, "дед" не одобряет, но не потому что всё новое плохо, а потому, что не всё новое хорошо.

    • @alexandrdeveloper1242
      @alexandrdeveloper1242 ปีที่แล้ว

      Дальше смотрю... На 29:55 - ну да, за такое отправил бы переписать. Но не так как борода показал. Кто мешает создать два отдельных метода которые проверяют наличие символа в конце строки и в начале? Назвать isStartChar и isEndChar (если мелкомягкие об этом не позаботились ещё...) и код в примере внезапно приобретет читаемость без всяких вывертов. Бородач то ли неудачно примеры подбирает, то ли сам не догадывается...

    • @nikolaifedorov685
      @nikolaifedorov685 10 หลายเดือนก่อน +1

      Так автор сам дед, этот как негр может говорить "негр"

  • @HelloWorld-ln5cy
    @HelloWorld-ln5cy ปีที่แล้ว +1

    11:41 как по мне первый "дедовский" вариант самый понятный и практичный из перечисленных. А по моему субьективному мнению тернарник это кал.