C#: When adding the same object to two List<object> variables, is the object cloned in the process?

后端 未结 7 1035
伪装坚强ぢ
伪装坚强ぢ 2021-01-01 19:28

I have something similar to this:

// Declarations:
List list1 = new List();
List list2 = new List

        
相关标签:
7条回答
  • 2021-01-01 20:03
    // Declarations:
    List<SomeType> list1 = new List<SomeType>();
    List<SomeType> list2 = new List<SomeType>();
    
    ...
    
    SomeType something = new SomeType("SomeName");
    list1.Add(something);
    list2.Add(something);
    

    Remember, when you add an object to a list, you're really just adding a pointer to the object. In this case, list1 and list2 both point to the same address in memory.

    list1[indexOfSomething] = new SomeType("SomeOtherName");
    

    Now you've assigned the element list1 to a different pointer.

    You're not really cloning objects themselves, you're copying the pointers which just happen to be pointing at the same object. If you need proof, do the following:

    SomeType something = new SomeType("SomeName");
    list1.Add(something);
    list2.Add(something);
    
    list1[someIndex].SomeProperty = "Kitty";
    
    bool areEqual = list1[someIndex].SomeProperty == list2[someIndex].SomeProperty;
    

    areEqual should be true. Pointers rock!

    0 讨论(0)
  • 2021-01-01 20:04

    You are not cloning the object; you are adding a reference to the same object in the two lists. However, your code replaces the reference in one of the lists with a reference to another object, so yes, this is the expected behaviour.

    0 讨论(0)
  • 2021-01-01 20:05

    When you pass the 'something' object to Add you are passing by value (c# default), not by reference

    0 讨论(0)
  • 2021-01-01 20:13

    Yes, but nothing's cloned. Before the assignment, the same object is in both lists. After the assignment, you have two unique objects in two lists.

    Do This:

    list1[indexOfSomething].name = "SomeOtherName";
    

    and the object in list2 will change, too.

    0 讨论(0)
  • 2021-01-01 20:13

    You're replacing the reference in one list with a reference to a new object. If you were to instead change a property of that object, you would see it changed in both places, since the reference would remain the same.

    0 讨论(0)
  • 2021-01-01 20:14

    Yes that is expected. Only the reference to the object is added. Not the reference itself or a copy.

    0 讨论(0)
提交回复
热议问题