2017-07-05 20 views
7

Aynı türden iki nesnenin aynı örnek olup olmadığını ve aynı bellek ayırımı olup olmadığını kontrol etmem gerekiyor. Sorun, türün aşırı yük operatörüne aşırı yüklenmesi ve dolayısıyla her ikisinin de eşitlikle karşılaştırılması olarak kullanacağı, ancak onları referans olarak kontrol etmem gerektiğidir. Ben object.ReferenceEquals() yöntemiyle baktım ama içtenEşitlik operatörü geçersiz kılındığında başvurulan iki nesneyi karşılaştırın

+0

Hayır öyle değil. * Kendi * eşitlik operatörünü kullanarak * referansları * karşılaştırır. Aşırı yüklü olanlar değil –

cevap

7

Operatörler geçersiz kılınamaz eşitlik operatörü uygular - onlar sadece aşırı olabilir.

Yani object.ReferenceEquals yılında == operatör hala referansları karşılaştırıyor ya bir tane döküm aynı şeyi kendiniz yapabilir veya iki işlenen olabilir:

string x = "some value"; 
string y = new string(x.ToCharArray()); 
Console.WriteLine(x == y);     // True 
Console.WriteLine((object) x == (object) y); // False 
Console.WriteLine(ReferenceEquals(x, y)); // False 
5

ReferenceEquals sen olmadıkça tam olarak, gerek yapar sözlükten bahsediyorum. Equals'u (tam anlamıyla yalnızca ldarg.0, ldarg.1, ceq, ret) denetlemez. Alternatif olarak, sadece nesnesine döküm:

Eğer Sözlük desteğe ihtiyaç varsa
bool same = (object)x == (object)y; 

(böylece: GetHashCode): System.Runtime.CompilerServices.RuntimeHelpers.GetHashCode(obj) arkadaşın.