Выражение 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, в котором обсуждается, как перегружать каждый. Обычно они будут одинаковыми, но нет никаких гарантий. Так что это зависит от типа объекта лямбда.

Ответ 4

Это зависит от того, что определено для объекта. Если для класса не определен оператор ==, он будет использовать один из класса Object, который проверяет Object.ReferenceEquals, прежде чем в конечном итоге вызовет Equals().

Это показывает важное различие: если вы говорите A.Equals(B), тогда A должно быть nun-null. если вы скажете A == B, A может быть нулевым.

Ответ 5

Лямбда здесь неактуальна...

Для объектов value == и equals одинаковы Для ссылочного объекта == будет истинно, если объекты являются одним и тем же объектом (указывает на один и тот же экземпляр), в то время как ожидается, что он сравнивает содержимое объектов. Эта ссылка объясняет это по-другому.