c#引用列表

时间:2013-03-03 17:36:41

标签: c# list

我想知道:如何将新成员添加到列表中,这样当我更改变量值时也会更改列表。

例如:

int a=4;

list<int> l=new list<int>();

l.Add(a);

a=5;

foreach(var v in l)
  Console.WriteLine("a="+v);

输出: 一个= 4

感谢

4 个答案:

答案 0 :(得分:2)

如果您希望这样做,您需要使用引用类型

使用值类型(例如int),您会在列表中获得变量的副本,而不是参考的副本。

请参阅MSDN上的Value Types and Reference Types

答案 1 :(得分:2)

这对于值类型变量列表不起作用,每次更改值类型变量时,都会在堆栈中获得新的变量值副本。所以解决方案是使用某种引用类型包装器。

class NumericWrapper
{
    public int Value { get; set; }
}

var items = new List<NumericWrapper>();
var item = new NumericWrapper { Value = 10 };
items.Add(item);

// should be 11 after this line of code
item.Value++;

答案 2 :(得分:1)

您可以构建一个包装容器,然后根据需要更新包装器的值。像下面这样的东西,例如:

 //item class
 public class Item<T>
    {
      T Value {get;set;}
    }

    //usage example
    private List<String> items = new List<string>();

    public void AddItem( Item<string> item)
    {
        items.Add(item);
    }

    public void SetItem(Item<T> item,string value)
    {
      item.Value=value;
    }

答案 3 :(得分:0)

您必须将int包装在引用类型中。

试试这个:

internal class Program
    {
        private static void Main(string[] args)
        {
            IntWrapper a = 4;

            var list = new List<IntWrapper>();

            list.Add(a);

            a.Value = 5;
            //a = 5; //Dont do this. This will assign a new reference to a. Hence changes will not reflect inside list.

            foreach (var v in list)
                Console.WriteLine("a=" + v);
        }
    }

    public class IntWrapper
    {
        public int Value;

        public IntWrapper()
        {

        }

        public IntWrapper(int value)
        {
            Value = value;
        }

        // User-defined conversion from IntWrapper to int
        public static implicit operator int(IntWrapper d)
        {
            return d.Value;
        }
        //  User-defined conversion from int to IntWrapper
        public static implicit operator IntWrapper(int d)
        {
            return new IntWrapper(d);
        }

        public override string ToString()
        {
            return Value.ToString();
        }
    }