Почему функция не изменяет данный узел (список)? - PullRequest
0 голосов
/ 06 мая 2018

У меня сейчас есть эта функция в моем коде:

public static void GoToNextNode(Node<int> head)
{
    head = head.GetNext();
}

И это моя основная функция:

Node<int> a1 = new Node<int>(5);
Node<int> a2 = new Node<int>(5,a1);
GoToNextNode(a2); // <---

Однако после выполнения строки, отмеченной стрелкой, она не перемещается по всему списку узлов к следующему объекту.

Сама функция работает, но она будет работать в основной программе, только если я заставлю ее вернуть следующее значение:

public static Node<int> GoToNextNode(Node<int> head)
{
    return head.GetNext();
}

А затем измените основную функцию на:

Node<int> a1 = new Node<int>(5);
Node<int> a2 = new Node<int>(5,a1);
a2 = GoToNextNode(a2); // <---

Есть идеи, почему первый вариант не работает? Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 06 мая 2018

Пропущенные значения, измененные внутри метода, не изменяются вне метода, если только вы не используете ref или out, что дает компилятору знать, что вы хотите, чтобы изменения значения внутри метода влияли на значение переменной вне области видимости. .

чтобы изменить значение вашего первого примера узла

Public static void GoToNext ( ref Node <int> head)
{
head = head.getNext ();
}
0 голосов
/ 06 мая 2018

Когда вы передаете объект методу, вы фактически не передаете сам этот объект, а только ссылка на этот метод. Поскольку сама эта ссылка передается значением , любые изменения в этом методе не отражаются извне. Это ничем не отличается от следующего:

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 внутри этого объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...