Когда вы передаете объект методу, вы фактически не передаете сам этот объект, а только ссылка на этот метод. Поскольку сама эта ссылка передается значением , любые изменения в этом методе не отражаются извне. Это ничем не отличается от следующего:
DoSomething(int i)
{
i = 3;
}
Конечно, вы можете переназначить любое новое значение на i
в методе. Любой клиентский код, однако, не будет отражать это вообще, он все равно будет видеть только то же самое значение, переданное в метод. Или другими словами: то, что вы делаете с i
в DoSomething
, остается на DoSomething
, никто не заметит этого.
Чтобы изменить ссылку, вам нужно ключевое слово ref
. Короче говоря, он позволяет вам изменить ссылку , переданную вашему методу, чтобы после вызова GotoNextNode
параметр a2
ссылался на другой экземпляр:
public static void GoToNextNode(ref Node<int> head)
{
head = head.GetNext();
}
Теперь вы можете назвать это так:
GoToNextNode(ref a2);
Когда, с другой стороны, вы хотите изменить только членов экземпляра, вам не нужен ref, как показано здесь:
void DoSometjng(MyClass a)
{
a.MyProperty = newValue;
}
Как видите, вы не ссылаетесь на a
, а просто модифицируете базовый объект. Теперь тот, кто использует этот код, конечно, увидит newValue
внутри этого объекта.