C# разница между == и Equals() за 30 секунд
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
Telegram канал:
t.me/codaza
Equals() работает с ссылочными типами или со всеми?
Это самое быстрое объяснение на диком западе! 🔥 Спасибо!!
🤠
Просто, понятно и быстро) Хотелось бы такой же короткий видос от вас про ToList(), AsEnumerable() и AsQueryable() 😊
Ахах))) ну тут за 30 секунд очень сложно)))
как всегда супер!
спасибо!
На самом деле зависит от реализации виртуального метода equals у класса object. По дефолту проверяются именно ссылки а не сами значения.
Ой, какой же ты умник! Что еще можешь добавить???
@@imbydlo1552ну стоит добавить, что Equals и == это переопределяемые вещи, гарантированно ответить на вопрос что именно они сравнивают мы не можем. Поэтому в случаях, когда нам тип неизвестен, и мы хотим проверить именно равенство ссылок, то конечно лучше вызывать статический метод ReferenceEquals
@@maximangetman не знаю чувак. Вроде я этот коммент не писал. Как будто матрица снова заиграла свое
Вау 🤩 Быстро и четко, спасибо!
Пожалуйста 🙂
Обажаю Прогграмированя
Блин так круто объясняешь 👍
Спасибо за объяснение
Пожалуйста 🙂
А не связано ли это с тем, что string является неизменяемым и ведёт себя как значимый тип, несмотря на то, что хранится в куче? А если будут другие типы объектов? Как тогда будет себя Equals вести?
Вот именно, блять, он ничего не обьяснил
string не ведёт себя как значимый тип...
@@user-dg7tu1eb6r тем не менее поведение похожее, плюс у string есть интернирование
Круто!
Ничего непонял ,но очень быстро👍
Разве если мы пишем
a = "1"
b = a, то b ссылается на а? b - это и есть а, это та же самая ссылка, мы скопировали ее значение, ссылки на ссылку тут быть не должно. Верно? Исправьте, если нет.
Нет, там ссылка на ссылку
Что-то немного не точно, РИхтер описывает Что == и Equals для объектов работет одинаково, и то и то сравнивает ссылки, информация не точная, если создать два объекта без патаметров то и == и Equals по умолчанию вернет False
пример, пожалуйста
Да, что-то из этого разряда, в определении метода Equals базового класса Object была реализация из одной условной конструкции, где сравниваются ссылки.
Equals будет сравнивать по значению, если тип значимый, это переопределено в ValueType, вроде-как. Ну за слова 100% не отвечу, пепроверьте у Рихтера)
👍👍
🙂👍
Почему в третьем примере ссвлки не равны а в первом равны?
Давай про == null и is null
Одинаво, до того момента как целевой класс не переопределяет оператор равенства. Тогда == вызовет переопределённый оператор, а is null напрямую проверит ссылку на null
@@lloydlion8959 Все верно, я просто подбросил идею для нового шорта
И зачем мне этот сисярп... Но почему-то смотрю. Интересно рассказываешь
А метод ReferenceEquals то же самое что и ==, да? То есть сравнивает ссылки.
Поставил лайк (стало 667) ещё и для того, чтоб не видеть 666 (лайков)😆
Это везде так?
В 3 ем примере интернирование?
👍👍👍
а вообще, все зависит от человека, который все это дело реализовывал у себя в классе)
На java мозги мне выворачивала эта ерунда, на флаттере сейчас хоть нет такого на нем пишу теперь
Подскажите, пожалуйста, где найти телеграмм канал? Оставьте его в комментариях, пожалуйста
Ловите ссылочку: t.me/codaza
если смотреть реализацию equals то оно работает так же как и ==
Если смотреть доку, и читать Рихтера, то работают они одинаково и сравнивают ссылки
@@vitalykolesnik9211 , они работают одинаково вплоть до того пока дело не касается строк, ибо строка являются ссылочным типом, но имеет семантику значимого типа, поэтому строки используют переопределенный Equals. Но ещё касательно Equals и == следовало упомянуть, что первый может выбросить NullReferenceEx, если первым параметром пихнуть null без разрешенного использования nullabale
А зачем вообще сравнивать ссылки и метод GetHashCode? Через который тоже сравниваются ссылки
Метод GetHashCode() не сравнивает ссылки. Он должен возвращать одно и то же значение для двух объектов, которые считаются равными в условиях заданной логики.
@@codaza-channel это если мы переопределяем?
@@yura131314 Да, если GetHashCode не переопределен, хэш-коды ссылочных типов вычисляются путем вызова Object.GetHashCode метода базового класса, который вычисляет хэш-код на основе ссылки объекта.
аналог == и is в Python. Только в Python == сравнивает значение, а is ссылаются ли они на один объект
Ошибочка, b ( в случае b = a) ссылается не на a, а на значение. То есть, указатели переменных указывают на один и тот же адрес нашего значения.
Да, в комментариях ниже уже указали на это. Таким образом я хотел подчеркнуть, что ссылки a и b равны. Формулировка: b ссылается на a, действительно не очень удачная.
@@codaza-channel понял, принял, обработал.
Зачем в примере string? Это примитивный тип. Это вам не Java
Ты без строк это обьясни
b = a - тут b не ссылается на a
Осторожнее с этим. Экземпляры классов так сравнить не получится, погорите на собесе.
А если
"//00//"
"//06//"
Полная чушь. == - это операнд сравнивающий ссылки. Equals() - это метод, в котором может быть написано что угодно, хоть return true;. В данном примере рассматривается объект типа object, в котором(можно чекнуть в коде) метод Equals() выглядит как Equals(object? a) { return this == a; }, что означает, что Equals() в данном примере будет работать абсолютно также как и ==. Но например для объекта типа string метод Equals() переопределен, и возвращает сравнение по содержимому. Но для string, к слову, операнд == также переопределен(да в си шарпе так можно), и тоже возвращает сравнение по содержимому.
Так тогда получается что в видосе полная чушь?
Ты сравниваеш объекты, а если сравнивать строки, то что будет? string a = "text"; string b = "text";?
Для вашего примера, в обоих случаях true.
@@codaza-channel слава богу, а вы в языке Си Шарите? А то я переписываю лексический анализатор и компилятор псевдо ассемблера, с Си на с Шарп, указатели обошел, но некоторые особенности языка си бесят))
@@dmitriynovikov8502 Большую работу делаете 🙂 Профессионально языком C я уже не пользовался очень давно, поэтому, можно сказать, не шарю 😥
@@codaza-channel эмулятор програм с джавы переписал, а вот ассемблер пытаюсь, указатели на char обошел создав строку и счётчик символов, а вот не могу понять как реализовать функцию strtol() Функция strtol() преобразует строковое представление числа, которое содержится в строке, адресуемой параметром-указателем start, в значение типа long int и возвращает полученный результат.
В конце наверное правильнее было бы показать две стрелочки на два квадратика, в которых одно и тоже значение. Тоесть ссылки идут на разные участки памяти, но в них записано одно и тоже значение. Или я что то не так понял?
Не совсем. В .NET есть такое понятие, как интернирование строк. Операция интернирования происходит с целью экономии физического места в heap. Таким образом, синее сердечко "💙" будет присутствовать в оперативной памяти в единственном экземпляре.
@@codaza-channel Спасибо за пояснение :) Удачи в развитии канала!
.
Слишком быстро
А зачем же метод Equals для значимых типов, ведь там и оператор "==" сравнивает значения?
Потому что все типы в dotnet наследуются от класса System.Object и метод Equals определён внутри него.
@@codaza-channel то есть для значимых типов разницы нет?
Точно 🙂
все хорошо если бы не полный бред. строки работают всегда по значению несмотря на то, что это ссилочный тип. поетому == копирует значение, а не ссилку на обьект
На самом деле нет, все хитрее, значение будет скопировано при выходе из метода, т.е. перед тем как облась стека в котором хранится строка станет неактуальной. Другим образом обьяснить не получится, потому что слишком запутанно и сложно - а вот обьяснение через работу стэка просто и исчерпывающе.
Не стоит забывать что программисты могут переопределить "==" и Equals().
Так что видео бесполезна
object a = "💙";
object b = a;
В видео было упомянуто, что переменная "a" ссылается на "💙", a "b" на "a". В таком случае оператор "==" должен вернуть "false", ведь получается, что "a" ссылается на один объект, а "b" на другой (на "a"). Разве "b" не должен ссылаться на тот же объект, что и "a"?
Нет, когда мы пишем b = a, для ссылочных типов, то происходит копирование ссылки. То есть, если где-то в оперативной памяти есть значение "💙" по адресу 0xAF, то a = b = 0xAF. Таким образом, значение ссылок равно.
@@codaza-channel да, я понимаю, но в видео было сказано, что "b" ссылается на "a", а не на строковый объект
Да, возможно, правильнее было бы сказать, что ссылки а и b равны.
В ютюбе уже начали разжевывать примитивные вещи из книжек c# for dummies? Сложные темы объяснять трудно, да. Давайте будем примитив жевать. Весь ютуб этим забит.
Ну Вы прям как-то на негативе. Лучше напишите тему, которая вам интересна и мы поговорим о ней как-нибудь на канале. Давайте вместе делать CZcams лучше 🙂
@@codaza-channel прошу прощения за это. Есть темы сложные, типа многопоточности или дженерики. Но их никто не обсуждает. Мало просмотров, трудно для понимания.
По этому все записывают такое что доступно каждому новичку.
@Aleksandr Savvopulo Всё же загляните на канал, там есть ролики с непростыми темами, которые мы уже обсудили. Например, паттерн Builder: czcams.com/video/2ReKJaM2glI/video.html) или Сборщик Мусора (Garbage Collector): czcams.com/video/8Uy9xgpAqnc/video.html и многое другое. Уверен, Вы найдете что-то интересно для себя.