要像上面那样工作,你需要让它不可变(没有设置器)——为了方便起见,可能使用一些隐式转换运算符。否则,人们可以在不更改(易失性)引用的情况下更改值。
public class MyThreadedClass
{
volatile Box<double> volDouble = 123.45;
}
public class Box<T> where T : struct
{
private readonly T value;
public Box(T value) { this.value = value; }
public T Value {get {return value;}}
// explicit as nulls are a problem...
public static explicit operator T(Box<T> box) {
return box.value; }
public static implicit operator T?(Box<T> box) {
return box == null ? new T?() : new T?(box.value); }
public static implicit operator Box<T>(T value) {
return new Box<T>(value); }
public static implicit operator Box<T>(T? value) {
return value.HasValue ? new Box<T>(value.Value) : null; }
}
除此之外 - 锁定将是最好的选择。