为什么作为引用的对象属性不更新

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么作为引用的对象属性不更新相关的知识,希望对你有一定的参考价值。

考虑此代码

class Program

    static void Main(string[] args)
    
        var lst = new List<MyObj>()
        
            new MyObj() name = "Old1", weight = 1,
            new MyObj() name = "Old2", weight = 2
        ;

        lst.Join(GetList(), p => p.weight, q => q, (p, q) =>
        
            p.name = "new";
            return p;
        );

        lst.ForEach(p => Console.WriteLine(p.name));
    
    public class MyObj
    
        public string name  get; set; 
        public int weight  get; set; 
    

    public static List<int> GetList()
    
        return new List<int>() 1,2;
    

此代码的输出为Old1,Old2。我不明白为什么在resultSelector函数中未更新“名称”。这是我的想法:MyObj实例是引用类型,我们正在将其加入,并将其收集在变量p中(我猜这是引用类型,即包含对原始MyObj的引用)。因此,在创建结果的函数内部,它将在原始MyObj所在的内存位置中更新“ name”属性(再次传递引用)。为什么不这样呢?我要去哪里错了?

答案

您没有将Join结果分配给任何变量,但它返回IEnumerable<T>。尝试稍微更新一下代码,保存加入的结果并对其进行迭代]

var result = lst.Join(GetList(), p => p.weight, q => q, (p, q) =>

    p.name = "new";
    return p;
).ToList();

result.ForEach(p => Console.WriteLine(p.name));

在当前代码中,您将查看源代码lst,该源代码保持不变

以上是关于为什么作为引用的对象属性不更新的主要内容,如果未能解决你的问题,请参考以下文章

如何解决循环引用?

Java面试题|深拷贝和浅拷贝区别是什么?

java(初学者):返回一个对象?是作为常量引用返回还是什么?

什么作为属性属性在objective-c中完全做了什么?

具有强引用的对象属性变为 null

c#传递引用对象作为参数的时候就没有必要用ref关键字,对吗