System.Threading.Interlocked.CompareExchange
обеспечивает атомную (таким образом, поточно-безопасную) реализацию С# операции Compare-And-Swap.
Например int i = 5; Interlocked.CompareExchange(ref i, 10, 5);
После этой команды int я будет иметь value = 10. А также сравнение и обмен происходит атомарно (одна операция).
Когда я попытался использовать это с экземпляром класса, сравнение сработает и значения не будут заменены.
public class X
{
public int y;
public X(int val) { y = val; }
}
Теперь, когда я делаю
X a = new X(1);
X b = new X(1);
X c = new X(2);
Interlocked.CompareExchange<X>(ref a, c, b);
Операция сравнения и обмена не работает. Итак, я переопределил Equals и оператор == для класса X как
public override bool Equals(object obj) { return y == ((X) obj).y; }
Итак, теперь я получаю Interlocked.Equals(a,b)
как true
, но операции CompareExchange
все еще не работают.
Есть ли способ сделать это? Я хочу сравнить два экземпляра класса и назначить одно из них значение, основанное на сравнении.