所以我需要一个列表(或类似的数据结构),一旦它被添加,它总是保存给定变量的当前值。这是当前发生的事情(更简单/伪代码):
intValue = 5;
intList.Add(intValue);
Print intList[0].toString();
打印“5”
intValue++;
Print intList[0].toString();
当我想要打印intValue的新值“6”时仍然打印“5”。
基本上,列表需要存储对intValue的引用(我认为这是正确的术语),而不是它的实际值。谢谢你的时间。
答案 0 :(得分:8)
您的问题非常类似于以下内容:
How to get a list of mutable strings?
更改已接受答案中的SortOfMutableString
实施,以存储int
值而不是string
,您将获得所需的效果。
另外,请查看Jon Skeet的回答。这对于充分理解此类解决方案的后果非常重要。
答案 1 :(得分:3)
这不是可以通过更改列表类型来完成的。您可能必须创建自己的引用类型,其行为类似于int
。在.net
结构中不是引用类型,所以它们不可能像你需要的那样得到这样的行为。
您必须意识到,您添加到列表中的int
只是复制,因此对源代码所做的任何更改都不会影响副本。
答案 2 :(得分:3)
这是因为在C#中,int
是值类型而不是引用类型。当你写
intValue = 5;
intList.Add(intValue);
您向intValue
添加副本,而不是对变量本身的引用。您想要的是将变量intValue
的引用添加到intList
。您可以做的是将int
值包装在您自己的类中(这是一种引用类型)。
答案 3 :(得分:1)
由于您需要存储引用而不是变量值,因此可以存储指针。您需要使用unsafe
关键字来使用C#中的指针。
unsafe
{
int intVal=5;
List<IntPtr> intList = new List<IntPtr> ( );
intList.Add ( new IntPtr ( &intVal ) );
MessageBox.Show ( ( *( ( int* ) ( intList[0].ToPointer ( ) ) ) ).ToString ( ) );
intVal++;
MessageBox.Show ( ( *( ( int* ) ( intList[0].ToPointer ( ) ) ) ).ToString ( ) );
}