Как определить, копируется ли значение или на него ссылаются?


Предположим, у нас есть программа, которая работает следующим образом:

namespace Example
{
    class Program
    {
        static void Main(string[] args)
        {
            Storage MainStorage = new Storage();

            PrintData Printer = new PrintData();

            Printer.GetStorage(MainStorage);
        }
    }

    class Storage
    {
        //Stores some data
    }

    class PrintData
    {
        Storage storage;

        public void GetStorage(Storage storage)
        {
            this.storage = storage;
        }

        public void Print()
        {
            //Prints data
        }
    }
}

Это просто пример, поэтому код не будет идеальным, но мой вопрос в этом случае делает ли метод GetStorage() копию объекта MainStorage или он делает ссылку на него?

2 2

2 ответа:

Это просто пример, поэтому код не будет идеальным, но мой вопрос в этом случае делает ли метод GetStorage() копию объекта MainStorage или он делает ссылку на него?

Он делает копию ссылки на экземпляр Storage. В этом случае поле в PrintData будет ссылаться на тот же экземпляр в памяти, что и тот, который вы назначаете MainStorage.

Вы можете проверить, имеет ли присваивание ссылочную семантику, проверив, является ли тип class или struct. Если это тип значения (struct), то копия будет иметь семантику копирования значения.

В этом примере он получает копию ссылки, а не сам объект.

Классы всегда копируются по ссылке. Структуры и перечисления копируются по значению, если в параметре метода не используется ключевое слово ref.

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