Что происходит при передаче объекта в метод в C#?

«Что происходит при передаче объекта в метод в C#?» — вопрос из категории C# Core, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В C# объекты (экземпляры ссылочных типов) передаются в методы по ссылке по значению (by value). Это означает:

  1. Передается копия ссылки, а не копия самого объекта.
  2. Через эту копию ссылки метод получает доступ к оригинальному объекту в куче. Поэтому изменения свойств или полей этого объекта будут видны вызывающему коду.
  3. Однако, если внутри метода переназначить параметр на новый объект (obj = new MyClass()), это изменение не затронет исходную ссылку у вызывающего кода, так как меняется только локальная копия ссылки.

Пример, демонстрирующий оба случая:

public class MyClass { public int Value { get; set; } }

void ProcessObject(MyClass obj)
{
    // Это изменение отразится на оригинальном объекте.
    obj.Value = 10;

    // Это изменение НЕ повлияет на ссылку в вызывающем коде.
    obj = new MyClass { Value = 99 };
}

// Использование:
var myObj = new MyClass { Value = 5 };
ProcessObject(myObj);
Console.WriteLine(myObj.Value); // Выведет: 10 (а не 5 и не 99)

Как изменить саму ссылку (передача по ссылке): Для этого используйте модификаторы ref или out.

void ReplaceObject(ref MyClass obj)
{
    // Теперь это изменит ссылку в вызывающем коде.
    obj = new MyClass { Value = 100 };
}

ReplaceObject(ref myObj);
Console.WriteLine(myObj.Value); // Выведет: 100

Ключевой вывод: По умолчанию вы работаете с тем же объектом, но не можете заменить ссылку на него у вызывающей стороны без ref/out.