13 Temmuz 2017 Perşembe

Operator == Overloading

Giriş
Bu tür kodları hiç sevmiyorum. Dili ve kodu çok karmaşık hale getiriyor.

Örnek
Thing isimli sınıfımız ve içinde bir Id alanı olsun. Sınıfın içine operator == ve operator != metodunu eklemek için şöyle yaparız.
public static bool operator ==(Thing self, Thing other)
{
  return !ReferenceEquals(self, null) && 
         !ReferenceEquals(other, null) && 
         self.Id == other.Id;
}

public static bool operator !=(Thing self, Thing other)
{
  return !(self == other);
}
Örnek
operator == için kısıt verebiliriz. T için SillyClass kısıtı vermek için şöyle yaparız.
class SillyClass
{
    public static string operator ==(SillyClass x, SillyClass y) => "equal";
    public static string operator !=(SillyClass x, SillyClass y) => "not equal";
}

class SillySubclass : SillyClass
{
    public static string operator ==(SillySubclass x, SillySubclass y) => "sillier";
    public static string operator !=(SillySubclass x, SillySubclass y) => "very silly";
}

var x = new SillySubclass();
var y = new SillySubclass();
OpTest(x, y);


static void OpTest<T>(T x, T y) where T : SillyClass
{
  Console.WriteLine(x == y);
  Console.WriteLine(x != y);
}

String Sınıfı
String için operator == overload edilmiştir ve reference comparison yerine denklik karşılaştırması yapar. Şöyle yaparız.
string x = "test";
string y = new string(x.ToCharArray());
Console.WriteLine(x == y); // Use string overload, checks for equality, result = true
Console.WriteLine(x.Equals(y)); // Use overridden Equals method, result = true
Console.WriteLine(ReferenceEquals(x, y)); // False because they're different objects
Console.WriteLine((object) x == (object) y); // Reference comparison again- result = false


Hiç yorum yok:

Yorum Gönder