我想澄清C#中的局部变量。
当我有一个List<SomeClass> listSomeClass
时,我有一个局部变量:
var localVar = listSomeClass[n];
对局部变量的任何更改都将更改listSomeClass[n]
然而,如果我有第二个局部变量通过第一个局部变量访问该类的属性。这实际上是属性的副本,对此的任何更改都不会影响{ {1}}。
即:
listSomeClass[n].SomeProperty
但是,如果我通过列表访问,它确实会更改属性。
即。
var localProperty = localVar.SomeProperty
这对于非基元的所有字段都是正确的吗?或者是因为列表和词典返回引用?
答案 0 :(得分:1)
“对局部变量的任何更改都将改变变量 listSomeClass [N]“
不完全是。您对本地变量引用的对象所做的任何更改都将影响listSomeClass[n]
项引用的对象,因为它是同一个对象。
如果更改局部变量,即为其指定不同的引用,则不会影响项listSomeClass[n]
或其引用的对象。
“如果我有第二个局部变量来访问它的属性 通过第一个局部变量类。这实际上是一份副本 财产和对此的任何更改都不会影响 listSomeClass [N] .SomeProperty“
这完全取决于财产的类型。第二个局部变量中的值始终是属性中值的副本,但这并不意味着它不会影响属性。
如果属性是值类型,则第二个局部变量是值的副本,更改局部变量对属性没有影响。
如果属性是引用类型,则局部变量是引用的副本,但这意味着局部变量和属性都引用同一对象。然后将第二个局部变量应用为第一个局部变量;更改变量引用的对象会影响proeperty,因为它引用同一个对象,但更改局部变量本身的值不会影响属性。