Узлы двоичного дерева передаются по ссылке? - PullRequest
0 голосов
/ 28 февраля 2020
    static int GetCount(BinTreeNode<int> L)
    {
        int count = 0;
        while (L != null)
        {
            count++;
            L = L.GetRight();
        }
        return count;
    }

У меня есть метод GetCount (). Теперь BinTreeNode - это класс, в котором есть члены: right, left и info. по какой-то причине в основной функции

    static void Main(string[] args)
    {
        var t2 = new BinTreeNode<int>(null, 1, new BinTreeNode<int>(null, 2, new BinTreeNode<int>(null, 3, null)));  
        //Console.WriteLine(TreeLessThanTree(t1, t2));
        Console.WriteLine(GetCount(t2));
        Console.WriteLine(t2.GetInfo()); // this prints 1
        Console.ReadKey();
    }

Это странно, поскольку в функции GetCount () значение L (которое передается по ссылке) меняется на ноль.

Почему t2 передается по ссылке? Почему не изменился t2?

Ответы [ 2 ]

3 голосов
/ 28 февраля 2020

Ссылка передается значением . Значение: значение из t2 равно по существу просто указатель, который оказывается адресом объекта; когда он передается по значению , указатель (т.е. 4 или 8 байт) копируется и передается. Неважно, что GetCount делает с локальной копией указатель: изменение на указатель не наблюдается на сайте вызова. Однако если метод изменяет объект в конце указателя , то эти изменения будут заметны.

0 голосов
/ 28 февраля 2020

Объект передается в методе. Все изменения, сделанные в свойствах этого объекта, будут сохранены.

Однако, если вы установите в методе переменную local , то оригинальный объект не будет изменен. Если вы хотите изменить переменную, вы должны явно использовать ключевое слово ref.

Например:

public class A
{
    public string Foo { get; set; }
}

public class Program
{
    // This is a local variable. If you set something else to this one, the original won't be changed
    //                              |
    //                              V
    public static void DoSomething(A a)
    {
        a.Foo = "42"; // <---- This changes the property in the original
        a = new A     // <---- This sets something to the local variable a
        {
            Foo = "Hello world"
        };
    }

    // This variable is passed by references. If you set something else to this one, the original will be changed
    //                                  |    |
    //                                  V    V
    public static void DoSomethingElse(ref A a)
    {
        a.Foo = "42"; // <---- This changes the property in the original
        a = new A     // <---- This sets something to the original
        {
            Foo = "Hello world"
        };
    }

    public static void Main()
    {
        var a = new A
        {
            Foo = "Bar"
        };
        DoSomething(a);

        Console.WriteLine(a.Foo); // This outputs 42

        // notice this --v
        DoSomethingElse(ref a);

        Console.WriteLine(a.Foo); // This outputs Hello world
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...