使用值类型作为引用类型的最佳方法?

时间:2013-06-25 19:50:07

标签: c# generics value-type reference-type

每当我需要引用Value类型时,我一直在使用类似的东西:

    public class RefHost<T> {
        public RefHost(T val)
        {
            Value = val;
        }
        private T _value;
        public T Value {
            get {
                return _value;
            }
            set {
                _value = value;
            }
        }
    }

我想知道是否有内置方式或更简单的方法将现有的Value类型用作引用类型?

示例:

public class Editor {
    public RefHost<int> Blah = new RefHost<int>(5);

    // Some kind of timer to increase the value of Blah every few ticks
}

有点像Editor的用户指定需要更改的值类型,并且可能有多个Editor实例,每个实例都有自己的值。我以计时器为例,但大部分时间它都是像滑块一样的用户控件。

5 个答案:

答案 0 :(得分:2)

我认为您正在寻找Tuple

答案 1 :(得分:1)

当然有。如果要将其作为参考类型传递给方法,只需使用ref修饰符:

public static void Main()
{
    int n = 1;
    Test(ref n);
    Console.WriteLine(n); //will print out 2 and not 1.
    Console.ReadKey(true);
}
public static void Test(ref int x)
{
    x = 2;
}

答案 2 :(得分:1)

这有什么问题?

public class Editor {
    public int Blah = 5;

    // Some kind of timer, with a handler like:
    void MyTimerTicker(object sender, EventArgs e)
    {
        this.Blah += 1;
    }
}

答案 3 :(得分:0)

拳击和拆箱就是这个名称。您的解决方案可能更安全。

请参阅http://msdn.microsoft.com/en-us/library/yz2be5wk.aspx

答案 4 :(得分:0)

使用公共字段替换属性和支持字段。虽然类通常使用属性而不是字段是好的,但是您的类型的整个目的是单个值类型实例的简单可变容器;通过对类型实例的任何引用封装的状态应该由两件事精确定义:

  1. `Value`成员的值
  2. Universe中任何位置存在的实例的所有其他引用的下落

如果两个实例具有相同的Value,并且如果在整个Universe中每个实例只存在一个引用,那么这两个引用应该在语义上无法区分[因为在这两种情况下都存在一组“其他引用”实例将是空的]

虽然有一种类型的样式可以实现的各种辅助方法,但是该类型的未来版本不可能在不违反预期语义的情况下添加其他状态。由于该类型的整个目的是表现得像一个包含T类型的单个字段的类对象,如果将对象写入实际上包含的类对象,代码将是最清晰的一个T类型的单个字段。

顺便说一句,如果您不想定义自定义类型,另一个选项是使用单个元素T[1]。这将使用一些额外的存储来保存维度,并且向[0]添加.Value将比{{1}}更加丑陋,但这种方法仍然可以非常简单。