C# разница между == и Equals() за 30 секунд

แชร์
ฝัง
  • เผยแพร่เมื่อ 19 ส.ค. 2022
  • Вопрос с технического собеседования. Рассмотрим разницу между двойным равенством (==) и методом Equals() в C# за 30 секунд.
    Telegram канал: t.me/codaza
    На кофе ☕️: pay.cloudtips.ru/p/179d0532
    Boosty: boosty.to/codaza
    Patreon: / codaza

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

  • @codaza-channel
    @codaza-channel  ปีที่แล้ว +7

    Telegram канал:
    t.me/codaza

    • @user-lh6xe3zi1t
      @user-lh6xe3zi1t 11 หลายเดือนก่อน

      Equals() работает с ссылочными типами или со всеми?

  • @chinchilla898
    @chinchilla898 ปีที่แล้ว +70

    Это самое быстрое объяснение на диком западе! 🔥 Спасибо!!

  • @user-rb5dg6cw3x
    @user-rb5dg6cw3x ปีที่แล้ว +11

    как всегда супер!
    спасибо!

  • @arthard8487
    @arthard8487 ปีที่แล้ว +21

    Просто, понятно и быстро) Хотелось бы такой же короткий видос от вас про ToList(), AsEnumerable() и AsQueryable() 😊

    • @IlyaArlenka
      @IlyaArlenka 4 หลายเดือนก่อน

      Ахах))) ну тут за 30 секунд очень сложно)))

  • @user-wp1nj5nr2q
    @user-wp1nj5nr2q 8 หลายเดือนก่อน +3

    На самом деле зависит от реализации виртуального метода equals у класса object. По дефолту проверяются именно ссылки а не сами значения.

    • @imbydlo1552
      @imbydlo1552 4 หลายเดือนก่อน

      Ой, какой же ты умник! Что еще можешь добавить???

    • @maximangetman
      @maximangetman 2 หลายเดือนก่อน +1

      ​@@imbydlo1552ну стоит добавить, что Equals и == это переопределяемые вещи, гарантированно ответить на вопрос что именно они сравнивают мы не можем. Поэтому в случаях, когда нам тип неизвестен, и мы хотим проверить именно равенство ссылок, то конечно лучше вызывать статический метод ReferenceEquals

    • @imbydlo1552
      @imbydlo1552 2 หลายเดือนก่อน

      @@maximangetman не знаю чувак. Вроде я этот коммент не писал. Как будто матрица снова заиграла свое

  • @user-jj9rb9nu2h
    @user-jj9rb9nu2h ปีที่แล้ว +4

    Вау 🤩 Быстро и четко, спасибо!

  • @Zack-ti1lj
    @Zack-ti1lj ปีที่แล้ว +2

    Спасибо за объяснение

  • @user-xq2cd1rj3v
    @user-xq2cd1rj3v ปีที่แล้ว +1

    Блин так круто объясняешь 👍

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

    Обажаю Прогграмированя

  • @kikorobert6047
    @kikorobert6047 7 หลายเดือนก่อน

    Круто!

  • @Ksushadik
    @Ksushadik 8 หลายเดือนก่อน +2

    А не связано ли это с тем, что string является неизменяемым и ведёт себя как значимый тип, несмотря на то, что хранится в куче? А если будут другие типы объектов? Как тогда будет себя Equals вести?

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

      Вот именно, блять, он ничего не обьяснил

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

      string не ведёт себя как значимый тип...

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

      @@user-dg7tu1eb6r тем не менее поведение похожее, плюс у string есть интернирование

  • @Shelby-js1fq
    @Shelby-js1fq 9 หลายเดือนก่อน

    Ничего непонял ,но очень быстро👍

  • @rafayelzakharyan2093
    @rafayelzakharyan2093 2 หลายเดือนก่อน

    👍👍

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

    Что-то немного не точно, РИхтер описывает Что == и Equals для объектов работет одинаково, и то и то сравнивает ссылки, информация не точная, если создать два объекта без патаметров то и == и Equals по умолчанию вернет False

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

      пример, пожалуйста

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

      Да, что-то из этого разряда, в определении метода Equals базового класса Object была реализация из одной условной конструкции, где сравниваются ссылки.

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

      Equals будет сравнивать по значению, если тип значимый, это переопределено в ValueType, вроде-как. Ну за слова 100% не отвечу, пепроверьте у Рихтера)

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

    Давай про == null и is null

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

      Одинаво, до того момента как целевой класс не переопределяет оператор равенства. Тогда == вызовет переопределённый оператор, а is null напрямую проверит ссылку на null

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

      @@lloydlion8959 Все верно, я просто подбросил идею для нового шорта

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

    Разве если мы пишем
    a = "1"
    b = a, то b ссылается на а? b - это и есть а, это та же самая ссылка, мы скопировали ее значение, ссылки на ссылку тут быть не должно. Верно? Исправьте, если нет.

    • @user-mc2kn4uo8n
      @user-mc2kn4uo8n 11 หลายเดือนก่อน

      Нет, там ссылка на ссылку

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

    🙂👍

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

    И зачем мне этот сисярп... Но почему-то смотрю. Интересно рассказываешь

  • @user-lh6xe3zi1t
    @user-lh6xe3zi1t 11 หลายเดือนก่อน

    👍👍👍

  • @crazy-man
    @crazy-man ปีที่แล้ว

    На java мозги мне выворачивала эта ерунда, на флаттере сейчас хоть нет такого на нем пишу теперь

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

    если смотреть реализацию equals то оно работает так же как и ==

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

      Если смотреть доку, и читать Рихтера, то работают они одинаково и сравнивают ссылки

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

      @@vitalykolesnik9211 , они работают одинаково вплоть до того пока дело не касается строк, ибо строка являются ссылочным типом, но имеет семантику значимого типа, поэтому строки используют переопределенный Equals. Но ещё касательно Equals и == следовало упомянуть, что первый может выбросить NullReferenceEx, если первым параметром пихнуть null без разрешенного использования nullabale

  • @dreemdreem3769
    @dreemdreem3769 3 หลายเดือนก่อน

    Почему в третьем примере ссвлки не равны а в первом равны?

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

    а вообще, все зависит от человека, который все это дело реализовывал у себя в классе)

  • @user-lh6xe3zi1t
    @user-lh6xe3zi1t 11 หลายเดือนก่อน

    А метод ReferenceEquals то же самое что и ==, да? То есть сравнивает ссылки.

  • @user-ey9xi9dq6l
    @user-ey9xi9dq6l ปีที่แล้ว +2

    Подскажите, пожалуйста, где найти телеграмм канал? Оставьте его в комментариях, пожалуйста

    • @codaza-channel
      @codaza-channel  ปีที่แล้ว +4

      Ловите ссылочку: t.me/codaza

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

    А зачем вообще сравнивать ссылки и метод GetHashCode? Через который тоже сравниваются ссылки

    • @codaza-channel
      @codaza-channel  ปีที่แล้ว

      Метод GetHashCode() не сравнивает ссылки. Он должен возвращать одно и то же значение для двух объектов, которые считаются равными в условиях заданной логики.

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

      @@codaza-channel это если мы переопределяем?

    • @codaza-channel
      @codaza-channel  ปีที่แล้ว

      @@yura131314 Да, если GetHashCode не переопределен, хэш-коды ссылочных типов вычисляются путем вызова Object.GetHashCode метода базового класса, который вычисляет хэш-код на основе ссылки объекта.

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

    Поставил лайк (стало 667) ещё и для того, чтоб не видеть 666 (лайков)😆

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

    В 3 ем примере интернирование?

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

    Это везде так?

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

    Ошибочка, b ( в случае b = a) ссылается не на a, а на значение. То есть, указатели переменных указывают на один и тот же адрес нашего значения.

    • @codaza-channel
      @codaza-channel  ปีที่แล้ว

      Да, в комментариях ниже уже указали на это. Таким образом я хотел подчеркнуть, что ссылки a и b равны. Формулировка: b ссылается на a, действительно не очень удачная.

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

      @@codaza-channel понял, принял, обработал.

  • @stan553
    @stan553 8 หลายเดือนก่อน

    Осторожнее с этим. Экземпляры классов так сравнить не получится, погорите на собесе.

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

    аналог == и is в Python. Только в Python == сравнивает значение, а is ссылаются ли они на один объект

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

    b = a - тут b не ссылается на a

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

    Ты сравниваеш объекты, а если сравнивать строки, то что будет? string a = "text"; string b = "text";?

    • @codaza-channel
      @codaza-channel  ปีที่แล้ว

      Для вашего примера, в обоих случаях true.

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

      @@codaza-channel слава богу, а вы в языке Си Шарите? А то я переписываю лексический анализатор и компилятор псевдо ассемблера, с Си на с Шарп, указатели обошел, но некоторые особенности языка си бесят))

    • @codaza-channel
      @codaza-channel  ปีที่แล้ว

      @@dmitriynovikov8502 Большую работу делаете 🙂 Профессионально языком C я уже не пользовался очень давно, поэтому, можно сказать, не шарю 😥

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

      @@codaza-channel эмулятор програм с джавы переписал, а вот ассемблер пытаюсь, указатели на char обошел создав строку и счётчик символов, а вот не могу понять как реализовать функцию strtol() Функция strtol() преобразует строковое представление числа, которое содержится в строке, адресуемой параметром-указателем start, в значение типа long int и возвращает полученный результат.

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

    А если
    "//00//"
    "//06//"

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

    Ты без строк это обьясни

  • @qwertymangames1800
    @qwertymangames1800 8 หลายเดือนก่อน

    Зачем в примере string? Это примитивный тип. Это вам не Java

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

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

    • @codaza-channel
      @codaza-channel  ปีที่แล้ว +1

      Не совсем. В .NET есть такое понятие, как интернирование строк. Операция интернирования происходит с целью экономии физического места в heap. Таким образом, синее сердечко "💙" будет присутствовать в оперативной памяти в единственном экземпляре.

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

      @@codaza-channel Спасибо за пояснение :) Удачи в развитии канала!

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

    А зачем же метод Equals для значимых типов, ведь там и оператор "==" сравнивает значения?

    • @codaza-channel
      @codaza-channel  ปีที่แล้ว

      Потому что все типы в dotnet наследуются от класса System.Object и метод Equals определён внутри него.

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

      @@codaza-channel то есть для значимых типов разницы нет?

    • @codaza-channel
      @codaza-channel  ปีที่แล้ว

      Точно 🙂

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

    Слишком быстро

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

    все хорошо если бы не полный бред. строки работают всегда по значению несмотря на то, что это ссилочный тип. поетому == копирует значение, а не ссилку на обьект

    • @user-xd1su3sk3i
      @user-xd1su3sk3i 8 หลายเดือนก่อน

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

  • @cliobro3890
    @cliobro3890 9 หลายเดือนก่อน

    Не стоит забывать что программисты могут переопределить "==" и Equals().
    Так что видео бесполезна

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

    Полная чушь. == - это операнд сравнивающий ссылки. Equals() - это метод, в котором может быть написано что угодно, хоть return true;. В данном примере рассматривается объект типа object, в котором(можно чекнуть в коде) метод Equals() выглядит как Equals(object? a) { return this == a; }, что означает, что Equals() в данном примере будет работать абсолютно также как и ==. Но например для объекта типа string метод Equals() переопределен, и возвращает сравнение по содержимому. Но для string, к слову, операнд == также переопределен(да в си шарпе так можно), и тоже возвращает сравнение по содержимому.

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

      Так тогда получается что в видосе полная чушь?

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

    object a = "💙";
    object b = a;
    В видео было упомянуто, что переменная "a" ссылается на "💙", a "b" на "a". В таком случае оператор "==" должен вернуть "false", ведь получается, что "a" ссылается на один объект, а "b" на другой (на "a"). Разве "b" не должен ссылаться на тот же объект, что и "a"?

    • @codaza-channel
      @codaza-channel  ปีที่แล้ว

      Нет, когда мы пишем b = a, для ссылочных типов, то происходит копирование ссылки. То есть, если где-то в оперативной памяти есть значение "💙" по адресу 0xAF, то a = b = 0xAF. Таким образом, значение ссылок равно.

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

      @@codaza-channel да, я понимаю, но в видео было сказано, что "b" ссылается на "a", а не на строковый объект

    • @codaza-channel
      @codaza-channel  ปีที่แล้ว

      Да, возможно, правильнее было бы сказать, что ссылки а и b равны.

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

    В ютюбе уже начали разжевывать примитивные вещи из книжек c# for dummies? Сложные темы объяснять трудно, да. Давайте будем примитив жевать. Весь ютуб этим забит.

    • @codaza-channel
      @codaza-channel  ปีที่แล้ว +1

      Ну Вы прям как-то на негативе. Лучше напишите тему, которая вам интересна и мы поговорим о ней как-нибудь на канале. Давайте вместе делать TH-cam лучше 🙂

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

      @@codaza-channel прошу прощения за это. Есть темы сложные, типа многопоточности или дженерики. Но их никто не обсуждает. Мало просмотров, трудно для понимания.
      По этому все записывают такое что доступно каждому новичку.

    • @codaza-channel
      @codaza-channel  ปีที่แล้ว +1

      ​ @Aleksandr Savvopulo Всё же загляните на канал, там есть ролики с непростыми темами, которые мы уже обсудили. Например, паттерн Builder: th-cam.com/video/2ReKJaM2glI/w-d-xo.html) или Сборщик Мусора (Garbage Collector): th-cam.com/video/8Uy9xgpAqnc/w-d-xo.html и многое другое. Уверен, Вы найдете что-то интересно для себя.