提问人:user1899020 提问时间:5/26/2016 最后编辑:user1899020 更新时间:5/26/2016 访问量:52
哪个版本 IList[i].Method() 调用?
Which version IList[i].Method() call?
问:
哪个版本需要索引器?设置版本还是获取版本?我有一个 .我调用了一个可变方法,发现没有改变。我认为它调用了 get 版本,而隐式副本出乎意料。请确认。谢谢。IList<T>[i].Method()
List<MutableStruct> list
list[0].MutableMethod()
list[0]
答:
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
评论
get