0

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

    public class RefHost<T> {
        public RefHost(T val)
        {
            Value = val;
        }
        private T _value;
        public T Value {
            get {
                return _value;
            }
            set {
                _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每个实例都有自己的值。我以计时器为例,但大多数时候它是一个像滑块一样的用户控件。

4

5 回答 5

2

我认为您正在寻找Tuple

于 2013-06-25T19:54:07.510 回答
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;
}
于 2013-06-25T19:53:50.200 回答
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;
    }
}
于 2013-06-25T20:31:52.503 回答
0

装箱和拆箱就是所谓的。不过,您的解决方案可能更安全。

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

于 2013-06-25T20:42:49.860 回答
0

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

  1. `Value` 成员的值
  2. 宇宙中任何地方存在的对实例的所有其他引用的下落

如果两个实例具有相同的Value,并且如果在整个 Universe 中每个实例仅存在一个引用,则这两个引用在语义上应该是不可区分的[因为在这两种情况下,实例的“其他引用”集合都是空的]

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

顺便说一句,如果您不想定义自定义类型,另一种选择是使用 single-element T[1]。这将使用一点额外的存储空间来保存维度,并且添加[0]到所有引用会比 更难看.Value,但是这种方法仍然可以非常简单地工作。

于 2013-06-25T23:58:51.880 回答