如何在列表中存储值类型的引用?
在以下代码中,
int x = 1;
list<int> l = new list<int>();
l.add(x);
x = 2;
l[0].toString();
我希望 l [0] .toString() 2 。
我尝试使用参考来解决,但我无法做到并找到任何解决方案。
答案 0 :(得分:1)
使用包装类:
class ReferenceValue<T>
{
public T Value { get; set; }
public ReferenceValue()
{
}
public ReferenceValue(T value)
{
this.Value = value;
}
public static implicit operator ReferenceValue<T>(T v)
{
return new ReferenceValue<T> { Value = v };
}
public static implicit operator T(ReferenceValue<T> r)
{
return r.Value;
}
// would be useful to override equality, == and comparison operators
public override string ToString()
{
var val = this.Value;
if (val != null)
{
return val.ToString();
}
else
{
return base.ToString();
}
}
}
使用:
var list = new List<ReferenceValue<int>>(new ReferenceValue<int>[] { 1, 2, 3 });
var ref1 = list[0];
var ref2 = new ReferenceValue<int>(4);
list.Add(5);
list.Add(ref2);
list[3].Value = 4;
ref2.Value = 5;
ref1.Value = 0;
// Prints: 02345
foreach (var val in list)
{
Console.Write(val.Value);
}
答案 1 :(得分:0)
因为它是值类型,所以不能像引用(类)类型那样对待它。您的上述代码无效,因为int
是值类型。
你可以创建一个class
,它在List
中保存int并存储实例,然后通过get/set
访问器更改int的值在课堂上。
这有意义吗?
答案 2 :(得分:0)
冒着被投票的风险......这是你可以做你想做的一种方式。我给你枪了,希望你不要自己开枪。
尽管有趣,但
unsafe {
var x = stackalloc int[1];
*x = 1;
var list = new List<IntPtr>() { (IntPtr)x };
(*x)++;
Console.WriteLine(*((int*)list[0])); // prints "2"
}
答案 3 :(得分:-2)
您还需要更新列表中的x
int x = 1;
list<int> l = new list<int>();
l.add(x);
x = 2;
l[0] = x;
l[0].toString();
将返回:
2