C# 如何创建泛型类?

标签 c# generics concurrency operator-overloading

我怎样才能使它通用?

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

最佳答案

您需要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)); }
}

关于C# 如何创建泛型类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1830406/

相关文章:

C# 阻止控制台窗口显示半秒?

c# - DataTable 中的# 是什么选择查询

c# - AutoFac/.NET Core - 注册 DBcontext

typescript - 如何使用基于泛型类型的条件类型来描述约束?

generics - 使用 Self 作为通用类型

c# - 有什么方法可以测试类似的属性吗?

Java 通配符通用,在 <? 上没有出现错误super String> 但否则错误为 "cannot be applied to Java.lang.String"

java - 不调用进入 future 名单

GO lang NATS 队列与多个队列订阅

java - 使用 boolean 值同步