如何通过引用访问集合中的值类型?

时间:2014-05-17 07:25:13

标签: c# collections value-type

无论如何通过引用获取值类型而不是通过值类型集合中的值获取值类型,类似于通过引用方法传递值类型的方式?

var myInts = new List<int> { 1, 2, 3 };
var item1 = myInts[0];
item1 += 23;
Console.WriteLine(myInts[0]);
// ouputs: 1
myInts[0] += 987;
Console.WriteLine(myInts[0]);
// outputs: 988

因此对item1变量的修改也将修改集合中的元素。

使用索引器的工作方式如上所述,因为我在获取后重新分配元素。

3 个答案:

答案 0 :(得分:1)

据我所知,这是不可能的。

写作时

var item1 = myInts[0];

将名为myInts的列表中索引为0的位置中存储的值分配给item1变量。由于此列表是值类型列表,因此分配给item1的值是元素在零位置的实际值,它不像myInts那样引用持有参考类型的实例。因此,对分配给item1的值的任何修改都不会导致对元素myInts[0]的修改。

实际上,我没有看到为什么你要问的东西会有用的原因。如果你能指出一个有用的用例,我将不胜感激。

答案 1 :(得分:1)

不,那是不可能的。

如果您要询问Int32,请回答。如果它是你自己的结构,你可以通过&#34;接口&#34;。

来实现它
interface IMyInt
{
    int Value{get;set;}
}

struct MyInt : IMyInt
{
    public int Value { get; set; }
}

void Main()
{
    var myInts = new List<IMyInt> { new MyInt{ Value = 1}, new MyInt{ Value = 2}, new MyInt{ Value = 3} };
    var item1 = myInts[0];
    item1.Value += 23;
    Console.WriteLine(myInts[0].Value);
}

打印

24

这是有效的,因为myInts包含将通过引用复制的盒装结构列表。

答案 2 :(得分:0)

你可以用lambdas玩一些小技巧来获得你想要的东西。

因此,如果您乐意传递对Action<Func<int, int>>的引用,则可以更新集合的元素。

所以给出:

var myInts = new List<int> { 1, 2, 3 };

我可以像这样定义一个委托:

Action<Func<int, int>> updateItem1 = f => myInts[0] = f(myInts[0]);

现在我可以在任何地方传递Action<Func<int, int>> updateItem1并像这样使用它:

updateItem1(x => x + 23);
updateItem1(x => x + 987);

这会更新集合的元素而不会传递集合。

试试这样:

var myInts = new List<int> { 1, 2, 3 };

Action<Func<int, int>> updateItem1 =
    f => myInts[0] = f(myInts[0]);

updateItem1(x => x + 23);
Console.WriteLine(myInts[0]); // 24
updateItem1(x => x + 987);
Console.WriteLine(myInts[0]); // 1011