2009-12-02 41 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