DETAYLAR, KURGU VE C# ISTRUCTURALEQUATABLE TEMEL ÖZELLIKLERI

Detaylar, Kurgu ve C# IStructuralEquatable Temel Özellikleri

Detaylar, Kurgu ve C# IStructuralEquatable Temel Özellikleri

Blog Article

That is, you can create your own definition of structural equality and specify that this definition be used with a collection type that accepts the IStructuralEquatable interface.

Now, when we call Equals ourselves it will directly call our new fancy Equals that takes in a ScreenMetrics, which is great.

Reference types (read classes) don't benefit as much. The IEquatable implementation does let you avoid a cast from System.Object but that's a very trivial gain. I still like IEquatable to be implemented for my classes since it logically makes the intent explicit.

Daniel A.A. PelsmaekerDaniel A.A. Pelsmaeker 49.2k2121 gold badges112112 silver badges160160 bronze badges 5 In addition to answers which point to duplicate hashcodes birli is documented behavior, some reasoning and reflection would also lead you to the same conclusion.

Although I think the gains from derece boxing will be less than the cost for having CanEqual. In that case you should seal your types and you no longer need CanEqual. Sealing also saf some performance benefits.

Your concern is that Object.GetHashCode() does hamiş provide values that are stable and the concern is very valid bey birey be seen in the first box headed by Caution in the documentation:

After some more testing I found that any two arrays with the same first element C# IStructuralEquatable nedir have the same hash. I still think this is strange behavior.

This is very disappointing behaviour from Microsoft; I'm now wondering if I should review the list of cases I've filed and see if other ones I've submitted have been removed...

The reason why you need the IStructuralEquatable is for defining a new way of comparision that would be right for all the objects .

I had the same question. When I ran LBushkin's example I was surprised to see that I got a different answer! Even though that answer katışıksız 8 upvotes, it is wrong. After a lot of 'reflector'ing, here is my take on things.

Safi on a certain ortam, I'm compelled to issue the standard warning derece to rely on the values of hashcodes or how they are computed, since it is derece guaranteed to be the same across updates or platforms.

The contract of Equals differs from that of IStructuralEquatable, in that it indicates whether 2 objects are logically equal.

There is no need for an equality operator that accepts different types. That should hamiş even compile. So this is a very weak excuse for having a non-generic interface that works with objects.

Being able to specify IStructuralEquatable/IStructuralComparable in such cases is actually useful. It would also be inconvenient to pass a TupleComparer or ArrayComparer everywhere you want to apply this type of comparison. The two approaches are derece mutually exclusive.

Report this page