2009-12-02 26 views
3

我該如何製作這個通用的?C#如何製作泛型類?

class AtomicReference 
{ 
    private Object _value; 

    public AtomicReference() 
    { 
     _value = new Object(); 
    } 

    public AtomicReference(Object value) 
    { 
     OptimisticSet(value); 
    } 

    public Object CompareAndSet(Object newValue) 
    { 
     return Interlocked.Exchange(ref _value, newValue); 
    } 

    public void OptimisticSet(Object newValue) 
    { 
     do { 
     } while (_value == Interlocked.CompareExchange(ref _value, _value, newValue)); 
    } 

    public Object Get() 
    { 
     return _value; 
    } 
} 

我的失敗嘗試:

class AtomicReference<T> 
{ 
    private T _value; 

    public AtomicReference() 
    { 
    } 

    public AtomicReference(T value) 
    { 
     Set(value); 
    } 

    public T CompareAndSet(T newValue) 
    { 
     // _value is not an object that can be referenced 
     return Interlocked.Exchange(ref _value, newValue); 
    } 

    public void OptimisticSet(T newValue) 
    { 
     // I can't use the operator== with type T 
     do{}while(_value == CompareAndSet(newValue)); 
    } 

    public T Get() 
    { 
     return _value; 
    } 
} 

回答

11

您需要constrainT是引用類型,像這樣:

class AtomicReference<T> where T : class { 
    private T _value; 

    public AtomicReference() { } 

    public AtomicReference(T value) { 
     OptimisticSet(value); 
    } 

    public T CompareAndSet(T newValue) { 
     return Interlocked.Exchange(ref _value, newValue); 
    } 

    public void OptimisticSet(T newValue) { 
     while (_value == CompareAndSet(newValue)); 
    } 

    public T Get() { 
     return _value; 
    } 
} 

編輯:我建議你也更換具有屬性的方法:

public T Value { 
    get { return _value; } 
    set { while(_value == CompareAndSet(value)); } 
} 
+1

再次感謝! :) SLaks是在遊戲的頂部! – Kiril 2009-12-02 03:07:26

+3

類型參數的約束(C#編程指南) - http://msdn.microsoft.com/zh-cn/library/d5x73970.aspx – kristian 2009-12-02 03:13:50