Каков наилучший способ обмена ссылками? - PullRequest
0 голосов
/ 07 января 2019

Каков наилучший способ обмена ссылками в C #?

Почему мой статический метод Exchange не работает? Но код в Main работает.

class  Person
{    
    public Person(int money)
    {
        Money = money;
    }
    public  int Money { get; set; }
    public static void Exchange(Person p1, Person p2)
    {
        Person newPerson = p1;
        p1 = p2;
        p2 = newPerson;
    }
   public object Clone()
    {
        return new Person( Money);
    }
}
 class Program
{     
    static void Main(string[] args)
    {
        Person p1 = new Person(100);
        Person p2=new Person(200);
        Person newPerson = p1;
        p1 = p2;
        p2 = newPerson;
        Console.WriteLine(p1.Money);
        Console.WriteLine(p2.Money);
        Console.ReadKey();
    }
}

Ответы [ 2 ]

0 голосов
/ 07 января 2019

Это потому, что в C # оба значения и ссылочные типы передаются по значению т.е. передается копия. Нам нужно явно указать, куда нам нужно передать их по ссылке.

Для типов ссылок передается копия ссылки. Таким образом, в вашем методе их замена не влияет на исходную ссылку на объект вне вызывающего метода, потому что переменные вне вызывающего метода имеют другую копию ссылки, чем те, которые находятся внутри метода, хотя они обе указывают на один и тот же объект и изменяют состояние с любой из них повлияет на объект.

Как и @ Джон указал , используйте ref для передачи ссылок по ссылке для этого.

0 голосов
/ 07 января 2019

Вам нужно ключевое слово ref:

public static void Exchange(ref Person p1, ref Person p2)

называется так:

Person.Exchange(ref person1, ref person2);

Причина в том, что без ref, p1 и p2 являются копиями ссылки . Это не значит, что они являются копиями объекта, но копиями ссылки на этот объект.

См. Документацию по ключевому слову ref для получения дополнительной информации.

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