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

Sdílet
Vložit
  • čas přidán 19. 08. 2022
  • Вопрос с технического собеседования. Рассмотрим разницу между двойным равенством (==) и методом Equals() в C# за 30 секунд.
    Telegram канал: t.me/codaza
    На кофе ☕️: pay.cloudtips.ru/p/179d0532
    Boosty: boosty.to/codaza
    Patreon: / codaza

Komentáře • 91

  • @codaza-channel
    @codaza-channel  Před rokem +7

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

    • @user-lh6xe3zi1t
      @user-lh6xe3zi1t Před 11 měsíci

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

  • @chinchilla898
    @chinchilla898 Před rokem +70

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

  • @user-rb5dg6cw3x
    @user-rb5dg6cw3x Před rokem +11

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

  • @arthard8487
    @arthard8487 Před rokem +21

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

    • @IlyaArlenka
      @IlyaArlenka Před 4 měsíci

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

  • @user-wp1nj5nr2q
    @user-wp1nj5nr2q Před 8 měsíci +3

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

    • @imbydlo1552
      @imbydlo1552 Před 4 měsíci

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

    • @maximangetman
      @maximangetman Před 2 měsíci +1

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

    • @imbydlo1552
      @imbydlo1552 Před 2 měsíci

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

  • @user-jj9rb9nu2h
    @user-jj9rb9nu2h Před rokem +4

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

  • @Zack-ti1lj
    @Zack-ti1lj Před rokem +2

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

  • @ayhanabdullayev
    @ayhanabdullayev Před měsícem

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

  • @user-xq2cd1rj3v
    @user-xq2cd1rj3v Před rokem +1

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

  • @kikorobert6047
    @kikorobert6047 Před 7 měsíci

    Круто!

  • @Ksushadik
    @Ksushadik Před 8 měsíci +2

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

    • @scc-6
      @scc-6 Před měsícem

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

    • @user-dg7tu1eb6r
      @user-dg7tu1eb6r Před měsícem

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

    • @Ksushadik
      @Ksushadik Před měsícem

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

  • @Shelby-js1fq
    @Shelby-js1fq Před 9 měsíci

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

  • @rafayelzakharyan2093
    @rafayelzakharyan2093 Před 2 měsíci

    👍👍

  • @Gorynysh_98
    @Gorynysh_98 Před rokem +4

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

    • @Valentin_PCMinsk_by
      @Valentin_PCMinsk_by Před rokem

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

    • @eueiiew
      @eueiiew Před rokem

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

    • @eueiiew
      @eueiiew Před rokem

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

  • @IvaNFallout
    @IvaNFallout Před rokem +5

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

    • @lloydlion8959
      @lloydlion8959 Před rokem +1

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

    • @IvaNFallout
      @IvaNFallout Před rokem +1

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

  • @kirillporozov3602
    @kirillporozov3602 Před rokem +2

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

    • @user-mc2kn4uo8n
      @user-mc2kn4uo8n Před 11 měsíci

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

  • @mega_mango
    @mega_mango Před rokem +4

    🙂👍

  • @uCryNet
    @uCryNet Před rokem

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

  • @user-lh6xe3zi1t
    @user-lh6xe3zi1t Před 11 měsíci

    👍👍👍

  • @crazy-man
    @crazy-man Před rokem

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

  • @mykola_ch
    @mykola_ch Před rokem +3

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

    • @vitalykolesnik9211
      @vitalykolesnik9211 Před rokem

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

    • @apdgslfhsodbna
      @apdgslfhsodbna Před rokem

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

  • @dreemdreem3769
    @dreemdreem3769 Před 3 měsíci

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

  • @dft_cyberboy
    @dft_cyberboy Před rokem

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

  • @user-lh6xe3zi1t
    @user-lh6xe3zi1t Před 11 měsíci

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

  • @user-ey9xi9dq6l
    @user-ey9xi9dq6l Před rokem +2

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

  • @yura131314
    @yura131314 Před rokem +1

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

    • @codaza-channel
      @codaza-channel  Před rokem

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

    • @yura131314
      @yura131314 Před rokem

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

    • @codaza-channel
      @codaza-channel  Před rokem

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

  • @Aleksandr__781
    @Aleksandr__781 Před rokem +2

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

  • @user-sp4ul5ym1y
    @user-sp4ul5ym1y Před rokem

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

  • @mioxive
    @mioxive Před měsícem

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

  • @jerrody5400
    @jerrody5400 Před rokem

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

    • @codaza-channel
      @codaza-channel  Před rokem

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

    • @jerrody5400
      @jerrody5400 Před rokem +1

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

  • @stan553
    @stan553 Před 8 měsíci

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

  • @user-zf8hu2bz1j
    @user-zf8hu2bz1j Před rokem

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

  • @user-tn9pq7bv5h
    @user-tn9pq7bv5h Před rokem

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

  • @dmitriynovikov8502
    @dmitriynovikov8502 Před rokem

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

    • @codaza-channel
      @codaza-channel  Před rokem

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

    • @dmitriynovikov8502
      @dmitriynovikov8502 Před rokem

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

    • @codaza-channel
      @codaza-channel  Před rokem

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

    • @dmitriynovikov8502
      @dmitriynovikov8502 Před rokem

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

  • @user-rs5ps1rz5c
    @user-rs5ps1rz5c Před rokem

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

  • @scc-6
    @scc-6 Před měsícem

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

  • @qwertymangames1800
    @qwertymangames1800 Před 8 měsíci

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

  • @makc3682
    @makc3682 Před rokem +1

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

    • @codaza-channel
      @codaza-channel  Před rokem +1

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

    • @makc3682
      @makc3682 Před rokem +2

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

  • @tarlanismailov5228
    @tarlanismailov5228 Před rokem

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

    • @codaza-channel
      @codaza-channel  Před rokem

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

    • @tarlanismailov5228
      @tarlanismailov5228 Před rokem

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

    • @codaza-channel
      @codaza-channel  Před rokem

      Точно 🙂

  • @clannajebyan
    @clannajebyan Před rokem

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

  • @oleksandrhome5787
    @oleksandrhome5787 Před rokem +1

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

    • @user-xd1su3sk3i
      @user-xd1su3sk3i Před 8 měsíci

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

  • @cliobro3890
    @cliobro3890 Před 9 měsíci

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

  • @denispetrovich3039
    @denispetrovich3039 Před 11 měsíci +1

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

    • @user-nh1lp8xt4j
      @user-nh1lp8xt4j Před 6 měsíci

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

  • @tarlanismailov5228
    @tarlanismailov5228 Před rokem

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

    • @codaza-channel
      @codaza-channel  Před rokem

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

    • @tarlanismailov5228
      @tarlanismailov5228 Před rokem +1

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

    • @codaza-channel
      @codaza-channel  Před rokem

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

  • @aleksandrsavvopulo4510
    @aleksandrsavvopulo4510 Před rokem +1

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

    • @codaza-channel
      @codaza-channel  Před rokem +1

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

    • @aleksandrsavvopulo4510
      @aleksandrsavvopulo4510 Před rokem

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

    • @codaza-channel
      @codaza-channel  Před rokem +1

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