每当我需要引用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
实例,每个实例都有自己的值。我以计时器为例,但大部分时间它都是像滑块一样的用户控件。
答案 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)
拳击和拆箱就是这个名称。您的解决方案可能更安全。
答案 4 :(得分:0)
使用公共字段替换属性和支持字段。虽然类通常使用属性而不是字段是好的,但是您的类型的整个目的是单个值类型实例的简单可变容器;通过对类型实例的任何引用封装的状态应该由两件事精确定义:
如果两个实例具有相同的Value
,并且如果在整个Universe中每个实例只存在一个引用,那么这两个引用应该在语义上无法区分[因为在这两种情况下都存在一组“其他引用”实例将是空的]
虽然有一种类型的样式可以实现的各种辅助方法,但是该类型的未来版本不可能在不违反预期语义的情况下添加其他状态。由于该类型的整个目的是表现得像一个包含T
类型的单个字段的类对象,如果将对象写入实际上是包含的类对象,代码将是最清晰的一个T
类型的单个字段。
顺便说一句,如果您不想定义自定义类型,另一个选项是使用单个元素T[1]
。这将使用一些额外的存储来保存维度,并且向[0]
添加.Value
将比{{1}}更加丑陋,但这种方法仍然可以非常简单。