Equality method for blob
Microsoft documentation for
public bool Binary.Equals(Binary other)
gives no indication as to whether this tests reference equality with both objects in general and value equality as with strings.
Can anyone clarify?
Jon Skeet's answer inspired me to expand it:
using System;
using System.Data.Linq;
public class Program
{
static void Main(string[] args)
{
Binary a = new Binary(new byte[] { 1, 2, 3 });
Binary b = new Binary(new byte[] { 1, 2, 3 });
Console.WriteLine("a.Equals(b) >>> {0}", a.Equals(b));
Console.WriteLine("a {0} == b {1} >>> {2}", a, b, a == b);
b = new Binary(new byte[] { 1, 2, 3, 4 });
Console.WriteLine("a {0} == b {1} >>> {2}",a,b, a == b);
/* a < b is not supported */
}
}
+2
Peter wone
source
to share
3 answers
Well, a simple test assumes this is an equivalent value:
using System;
using System.Data.Linq;
class Program {
static void Main(string[] args)
{
Binary a = new Binary(new byte[] { 1, 2, 3 });
Binary b = new Binary(new byte[] { 1, 2, 3 });
Console.WriteLine(a.Equals(b)); // Prints True
}
}
The fact that they took the trouble to implement IEquatable<Binary>
and override Equals(object)
to start by suggesting value equality semantics too ... but I agree the docs should make this clear.
+6
Jon Skeet
source
to share
This is a comparison of values ββfor a reflector ...
private bool EqualsTo(Binary binary)
{
if (this != binary)
{
if (binary == null)
{
return false;
}
if (this.bytes.Length != binary.bytes.Length)
{
return false;
}
if (this.hashCode != binary.hashCode)
{
return false;
}
int index = 0;
int length = this.bytes.Length;
while (index < length)
{
if (this.bytes[index] != binary.bytes[index])
{
return false;
}
index++;
}
}
return true;
}
+3
Abhijeet patel
source
to share
The reflector shows that Binary.Equals is being compared on a real binary value, not a reference.
+2
skevar7
source
to share