Два или более свойства в классе, которые имеют значение из одной и той же переменной, связаны - PullRequest
0 голосов
/ 01 августа 2020

Итак, в моем проекте 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.

1 Ответ

0 голосов
/ 01 августа 2020

В вашем примере кода JS переменная является ссылочным значением, и вы передаете переменную в качестве параметра в ClassWithTwoValues.

  • Таким образом, внутри class1 и class2 указывают на одну и ту же ссылку ( адрес в памяти )
  • Таким образом, даже когда изменяется только class1.value, class2.value также отражает то же значение.

Быстрое исправление:

  1. Использование оператора распространения

    var variableWithTwoValue = new ClassWithTwoValues(variable, {...variable});

  2. ИЛИ Использование Json Преобразование

    const secondvariable = JSON.parse(JSON.stringify(variable));
    var variableWithTwoValue = new ClassWithTwoValues(variable, secondvariable);

Оба метода будут указывать новую ссылку на память для class2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...