如何在列表中存储值类型的引用?

时间:2014-04-09 12:51:15

标签: c#

如何在列表中存储值类型的引用?

在以下代码中,

int x = 1;
list<int> l = new list<int>();
l.add(x);
x = 2;
l[0].toString();

我希望 l [0] .toString() 2
我尝试使用参考来解决,但我无法做到并找到任何解决方案。

4 个答案:

答案 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