哪个版本 IList[i].Method() 调用?

Which version IList[i].Method() call?

提问人:user1899020 提问时间:5/26/2016 最后编辑:user1899020 更新时间:5/26/2016 访问量:52

问:

哪个版本需要索引器?设置版本还是获取版本?我有一个 .我调用了一个可变方法,发现没有改变。我认为它调用了 get 版本,而隐式副本出乎意料。请确认。谢谢。IList<T>[i].Method()List<MutableStruct> listlist[0].MutableMethod()list[0]

c# 列表 可变

评论

3赞 juharr 5/26/2016
可变结构是邪恶的,你亲眼目睹了原因。
5赞 Ivan Stoev 5/26/2016
通过索引器更改结构的唯一方法是使用数组索引器。由于语义原因,所有其他人都返回副本。get

答:

4赞 juharr 5/26/2016 #1

这是因为当传递一个结构体时,你会得到整个结构体的副本,而引用类型则是引用的副本。这意味着,一旦你从列表中获取结构体,你就有一个副本,并且该方法将在该副本上调用,而不是在列表中的副本上调用。为此,您必须将列表中的值分配给一个变量,然后对其进行更改,然后将其重新分配。这就是为什么可变结构被认为是一个坏主意

public struct MutableStruct
{
    public int Value { get; private set; }

    public void MutableMethod()
    {
        Value = 5;
    }
}

使用此代码

var list = new List<MutableStruct>();
list.Add(new MutableStruct());

Console.WriteLine(list[0].Value);
list[0].MutableMethod();
Console.WriteLine(list[0].Value);
var x = list[0];
x.MutableMethod();
list[0] = x;
Console.WriteLine(list[0].Value);

输出

0

0

5