(C#) Как скопировать классы по типу значения, а не по ссылочному типу? - PullRequest
2 голосов
/ 15 апреля 2020

Возьмите следующий код:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MyClass
{
    public int myNumber;
}

public class Test : MonoBehaviour
{
    MyClass class1 = new MyClass();
    MyClass class2 = new MyClass();

    void Start()
    {
        class1.myNumber = 1;
        class2 = class1;
        class2.myNumber = 2;

        Debug.Log(class1.myNumber); //output: 2 (I'd want it to output 1!!!)
    }
}

Теперь, если я правильно понял, в C# классы являются ссылочным типом, а не типом значения, поэтому такое поведение желательно.
Однако, что мне нужно сделать, чтобы не сделать это так? Что я мог сделать, чтобы сделать нормальное присвоение значения, не "связывая" два класса вместе?

Я понимаю, что мог бы заменить строку 18 на это:

class2.myNumber = class1.myNumber;

И это будет делать то, что я хочу (так как я присваиваю тип значения, а не ссылочный тип), но это немного неудобно для моего случая ... в моем реальном сценарии класс имеет несколько подэлементов, которые мне нужно скопировать во многих разных местах.

Существует ли однострочный метод для копирования класса в новый, без привязки к нему ссылки на исходный, но путем создания нового независимого класса?

Ответы [ 3 ]

1 голос
/ 15 апреля 2020

Выполните глубокое или мелкое копирование в зависимости от ваших потребностей. https://docs.microsoft.com/en-us/dotnet/api/system.object.memberwiseclone?view=netframework-4.8

0 голосов
/ 15 апреля 2020

Как насчет этого?

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MyClass
{
    public int myNumber;
}

public class Test : MonoBehaviour
{
    MyClass class1 = new MyClass();
    MyClass class2 = new MyClass();

    private void Start()
    {
        class1.myNumber = 1;
        class2 = GetClassCopy(class1);
        class2.myNumber = 2;
        Debug.Log(class1.myNumber); // output:1
    }

    private MyClass GetClassCopy(MyClass source)
    {
        MyClass result = new MyClass();
        result.myNumber = source.myNumber;
        return result;
    }
}
0 голосов
/ 15 апреля 2020

C# имеет нечто, называемое Struct, которое в основном является облегченной версией Class, являющейся типом значения. Если вам конкретно нужен тип значения, вы можете использовать Structs вместо Classes.

Основными отличиями являются то, что не требуется создавать экземпляры для структур с использованием «нового» назначения, они не могут наследоваться от другой структуры или класса и не могут использоваться в качестве основы для другого класса.

...