【问题标题】:C# How to make a generic class?C#如何制作一个泛型类?
【发布时间】:2010-12-22 06:31:18
【问题描述】:

我怎样才能使这个通用?

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;
    }
}

【问题讨论】:

    标签: c# generics concurrency operator-overloading


    【解决方案1】:

    你需要 constrain T 是一个引用类型,像这样:

    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)); }
    }
    

    【讨论】:

    【解决方案2】:

    我没有在家里安装 VS 2005 来帮助调试您的解决方案,但我认为您需要限制 T。这里有一些资源可以提供帮助:

    Generics C#

    Generics Explained (.NET Framework version 2.0)

    【讨论】:

      猜你喜欢
      • 2010-11-20
      • 1970-01-01
      • 2019-07-25
      • 1970-01-01
      • 2019-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多