交换参考的最佳方法是什么?

时间:2019-01-07 05:44:20

标签: c# reference

在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 :(得分:2)

您需要ref关键字:

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

这样称呼:

Person.Exchange(ref person1, ref person2);

原因是没有refp1p2引用的副本。并不是说它们是对象的副本,而是对该对象的引用的副本。

有关更多信息,请参见ref keyword上的文档。

答案 1 :(得分:2)

这是因为在C#中,值和引用类型都通过值传递,即传递副本。我们需要明确告知需要在何处通过引用传递它们。

对于引用类型,将传递引用副本。因此,在您的方法内部交换它们不会影响调用方法外部的原始对象引用,因为调用方法外部的变量与方法内部的变量具有不同的引用副本,尽管它们都指向同一对象并更改状态。它们中的任何一个都会影响物体。

@John pointed使用ref来通过引用传递引用。