始终包含当前变量值的列表。 C#

时间:2011-10-26 06:19:54

标签: c# list mutable

所以我需要一个列表(或类似的数据结构),一旦它被添加,它总是保存给定变量的当前值。这是当前发生的事情(更简单/伪代码):

intValue = 5;
intList.Add(intValue);

Print intList[0].toString();

打印“5”

intValue++;
Print intList[0].toString();

当我想要打印intValue的新值“6”时仍然打印“5”。

基本上,列表需要存储对intValue的引用(我认为这是正确的术语),而不是它的实际值。谢谢你的时间。

4 个答案:

答案 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 ( ) );
  }