.net - IEquatable<T> - Best practice override for .Equals(object obj) in C# -
whenever write new class
or struct
hold data, may need compared, implement iequatable<t>
provides class/struct
typed .equals(t other)
method.
example:
public struct radius : iequatable<radius> { public int32 topleft { get; set; } public int32 topright { get; set; } public int32 bottomleft { get; set; } public int32 bottomright { get; set; } public bool equals(radius other) { return this.topleft == other.topleft && this.topright == other.topright && this.bottomleft == other.bottomleft && this.bottomright == other.bottomright; } }
as providing implementation .equals(radius other)
, should override default implementation (.equals(object obj)
)
i have 2 options here, , question is, of these implementations better?
option 1 use casting:
public override bool equals(object obj) { return this.equals((radius)obj); }
option 2 use "as" keyword:
public override bool equals(object obj) { return this.equals(obj radius); }
my reason asking is, using casting throw exception if obj
cannot cast radius
, whereas as
resolve null
if cannot cast, therefore checks this
against null
, without throwing exception; better throw exception, or return false
?
edit: has been pointed out quite few fellow so'ers, structs cannot null, therefore second option not apply struct. therefore question springs mind: should overridden implementation of .equals(object obj)
identical structs , classes?
the equals()
method must never throw exception.
an object of different type merely unequal.
quoting documentation:
implementations of equals must not throw exceptions; should return value. example, if obj null, equals method should return false instead of throwing argumentnullexception.
Comments
Post a Comment