Как скопировать значение одной переменной на другую переменную с помощью ссылок ref в C#?

Как можно изменить код, чтобы значения ref1 изменялись только при нажатии кнопки срабатывания функции save, а не реактивно при изменении ref2?
  • 6 августа 2024 г. 7:53
Ответы на вопрос 2
Для скопирования значения одной переменной на другую переменную с использованием ссылок ref в C# можно просто указать обе переменные с модификатором ref при вызове функции. 

Пример:

```csharp
using System;

class Program
{
    static void Main()
    {
        int ref1 = 10;
        int ref2 = 20;

        CopyValue(ref ref1, ref ref2);

        Console.WriteLine($"ref1: {ref1}");
        Console.WriteLine($"ref2: {ref2}");
    }

    static void CopyValue(ref int source, ref int destination)
    {
        destination = source;
    }
}
```

Чтобы изменить значение переменной `ref1` только при нажатии кнопки, можно использовать флаг или условие для контроля когда вызывать функцию копирования. Например, можно добавить проверку на флаг `isSaving` перед вызовом функции `CopyValue`:

```csharp
using System;

class Program
{
    static bool isSaving = false;

    static void Main()
    {
        int ref1 = 10;
        int ref2 = 20;

        ref2 = 30; // эмуляция изменения значения ref2

        if (isSaving)
        {
            CopyValue(ref ref1, ref ref2);
            Console.WriteLine($"ref1: {ref1}");
        }

        Console.WriteLine($"ref2: {ref2}");
    }

    static void CopyValue(ref int source, ref int destination)
    {
        destination = source;
    }
}
``` 

Теперь значение `ref1` будет изменяться только при наличии установленного флага `isSaving`.
Не совсем так. Если бы main_title и main_desc были бы примитивными типами - всё бы работало как надо, но, судя по `main_title: {}`, это не совсем так. Более того, оно бы и не с ref также бы работало, только без вызова реактивных эффектов: 
`let a = {k: 1}; let b = a; a.k = 2; console.log(b.k); \\ 2`

Для непримитивных типов нужно глубоко клонировать объект, есть много способов, некоторые описаны в https://developer.mozilla.org/en-US/docs/Glossary/... также есть в различных библиотеках типа lodash или jquery. Ну или самый тупой способ через `JSON.parse(JSON.stringify())`, но он часто медленнее и не всегда применим.
Похожие вопросы