2009-12-02 4 views
3

Comment puis-je rendre ce générique?C# Comment créer un cours générique?

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

Ma tentative avortée:

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

Répondre

11

Vous devez constrainT être un type de référence, comme ceci:

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

EDIT: Je vous recommande de remplacer également les méthodes ayant une propriété:

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

Merci encore! :) SLaks est au top du jeu! – Kiril

+3

Contraintes sur les paramètres de type (Guide de programmation C#) - http://msdn.microsoft.com/fr-fr/library/d5x73970.aspx – kristian

Questions connexes