Выражение Lambda: == vs..Equals()
Это чисто академический вопрос, но какая разница между использованием == и .Equals внутри лямбда-выражения и какой из них предпочтительнее?
Примеры кода:
int categoryId = -1;
listOfCategories.FindAll(o => o.CategoryId == categoryId);
или
int categoryId = -1;
listOfCategories.FindAll(o => o.CategoryId.Equals(categoryId));
Ответы
Ответ 1
Для ссылочных типов == предназначен для передачи ссылки равенства — эти две переменные относятся к одному экземпляру объекта.
.Equals()
предназначен для передачи значения равенства =— сделайте два, вероятно, разные экземпляры объектов, на которые ссылаются две переменные, имеют одно и то же значение, для некоторого определения "того же", которое вы предоставляете, перегружая метод.
Для типов значений эти два значения размыты.
Ответ 2
Они могут быть перегружены отдельно, поэтому они могут предоставить разные ответы. См. http://msdn.microsoft.com/en-us/library/ms173147(VS.80).aspx, в котором обсуждается, как перегружать каждый. Обычно они будут одинаковыми, но нет никаких гарантий. Так что это зависит от типа объекта лямбда.
Ответ 3
Это дубликат
Разность С# между == и Equals()
Для некоторых дополнительных мыслей о разных типах равенства и о том, как никто из них не делает то, что вам действительно нужно, см.
http://blogs.msdn.com/ericlippert/archive/2009/04/09/double-your-dispatch-double-your-fun.aspx
Ответ 4
Это зависит от того, что определено для объекта. Если для класса не определен оператор ==, он будет использовать один из класса Object, который проверяет Object.ReferenceEquals, прежде чем в конечном итоге вызовет Equals().
Это показывает важное различие:
если вы говорите A.Equals(B)
, тогда A должно быть nun-null. если вы скажете A == B
, A может быть нулевым.
Ответ 5
Лямбда здесь неактуальна...
Для объектов value == и equals одинаковы
Для ссылочного объекта == будет истинно, если объекты являются одним и тем же объектом (указывает на один и тот же экземпляр), в то время как ожидается, что он сравнивает содержимое объектов. Эта ссылка
объясняет это по-другому.
Ответ 6
Это больше выдающийся в мире Java. В основном '==' перегрузка оператора и . Equals() is базовый метод для класса Object.