У меня есть словарь, из которого я "копирую" форму объекта следующим образом:

public class MyClass
{
    public string objectId;
    public string name;
}

Dictionary<string, MyClass> dictionary = new Dictionary<string, MyClass>();
dictionary.Add("1234", new MyClass() { objectId = "1234", name = "Peter" });
dictionary.Add("2314", new MyClass() { objectId = "2314", name = "Tim" });
dictionary.Add("4321", new MyClass() { objectId = "4321", name = "Viggo" });

MyClass newObject = new MyClass();

newObject = dictionary["1234"];

newObject.name = "Tommy";

Теперь я хочу добиться того, чтобы имя менялось только в новом объекте, а не в словаре... Как и сейчас, любые изменения, внесенные в новый объект, также изменяются внутри словаря...

Как мне их отделить?

Надеемся на помощь и заранее спасибо :-)

c#
0
Mansa 19 Янв 2022 в 11:24
MyClass existingObject = dictionary["1234"];
 – 
Lei Yang
19 Янв 2022 в 11:27
1
 – 
Giovanni Esposito
19 Янв 2022 в 11:28
Ваш код создает новый экземпляр MyObject(), а затем отбрасывает его и устанавливает себя в качестве экземпляра внутри словаря. Вам нужно создать новый объект и скопировать старые значения, например. public static MyClass Clone(MyClass instance ) => new MyClass {objectId = instance.objectId, name = instance.name}; и var newObj = MyClass.Clone(dictionary["1234"])
 – 
Patrick Artner
19 Янв 2022 в 11:30

3 ответа

Вместо этого следует использовать record. класса.

Затем вы можете использовать Nondestructive mutation, чтобы скопировать запись в новую с такими необходимыми изменениями.

var newObject = dictionary["1234"] with { name = "Tommy" };

Подробнее об этом можно прочитать здесь

1
xakpc 19 Янв 2022 в 11:34

Это может быть помощь

            Dictionary<string, MyClass> dictionary = new Dictionary<string, MyClass>();
        dictionary.Add("1234", new MyClass() { objectId = "1234", name = "Peter" });
        dictionary.Add("2314", new MyClass() { objectId = "2314", name = "Tim" });
        dictionary.Add("4321", new MyClass() { objectId = "4321", name = "Viggo" });

        MyClass newObject = new MyClass
        {
            objectId = dictionary["1234"].objectId,
            name = dictionary["1234"].name
        };

        newObject.name = "Tommy";
0
Alp 19 Янв 2022 в 11:29

Класс — это тип ссылки. Когда вы пытаетесь скопировать значение объекта из словаря следующим образом:

newObject = dictionary["1234"];

Вы копируете ссылку на объект, а не значения полей объекта.

При изменении значения полей нового объекта (в котором хранится ссылка на объект из словаря) - вы меняете значения по ссылке, т.е. они изменятся в исходном объекте.

Самый простой способ создать новый объект класса — использовать значения полей объекта из словаря:

MyClass newObject = new MyClass() 
{
    objectId = dictionary["1234"].objectId, 
    name = dictionary["1234"].name
};

Или

MyClass newObject = new MyClass();
newObject.objectId = dictionary["1234"].objectId;
newObject.name = dictionary["1234"].name;

При этом изменения в новом объекте не повлияют на «базовый объект из словаря».

0
On_Luck 19 Янв 2022 в 12:06