Итак, в моем проекте JS была ситуация, когда у класса было два свойства, в которых значения были получены из одной и той же переменной. При попытке изменить первое свойство каким-то образом второе свойство также имело те же изменения.
Затем я подумал, что с моим кодом что-то не так, поэтому я создал новый тестовый файл, чтобы проверить, работает ли мой алгоритм что-то не так. И, к сожалению, то же самое произошло, когда я попробовал простые классы.
Вот код:
class ClassWithValue {
constructor(input) {
this.value = input;
}
};
class ClassWithTwoValues{
constructor(class1, class2) {
this.class1 = class1;
this.class2 = class2;
}
};
var variable = new ClassWithValue(12);
//document.write(variable.value);// Returns 12
var variableWithTwoValue = new ClassWithTwoValues(variable, variable);
variableWithTwoValue.class2.value += 10;
document.write(variableWithTwoValue.class2.value + " ");// Returns 22
document.write(variableWithTwoValue.class1.value);// Also returns 22
Затем я попытался воспроизвести его в C#, потому что я считал, что это все еще я, который не очень хорошо понял JS OOP. Но, к сожалению, результаты были такими же.
Вот код:
class Program
{
static void Main(string[] args)
{
ClassWithValue var1 = new ClassWithValue(12);
ClassWithTwoValues var2 = new ClassWithTwoValues(var1, var1);
var2.class1.value += 10;
Console.WriteLine(var2.class1.value);// Returns 22
Console.WriteLine(var2.class2.value);// Also returns 22
}
}
public class ClassWithValue
{
public int value { get; set; }
public ClassWithValue(int input)
{
this.value = input;
}
}
public class ClassWithTwoValues
{
public ClassWithValue class1 { get; set; }
public ClassWithValue class2 { get; set; }
public ClassWithTwoValues(ClassWithValue value1, ClassWithValue value2)
{
this.class1 = value1;
this.class2 = value2;
}
}
Итак, что я делаю не так и как я могу решить эту проблему?
Закрытие:
- Для JS: Хемант Халвай предложил два отличных решения. И после некоторых копаний я также обнаружил, что Object.assign () можно использовать в качестве третьего решения.
- Для C#: К сожалению, мне не удалось найти такое простое решение, как пример JS. Некоторые предлагают создать метод с нуля, который копирует объект, в то время как другие предлагают использовать метод Object.MemberwiseClone.