在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();
}
}
答案 0 :(得分:2)
您需要ref
关键字:
public static void Exchange(ref Person p1, ref Person p2)
这样称呼:
Person.Exchange(ref person1, ref person2);
原因是没有ref
,p1
和p2
是引用的副本。并不是说它们是对象的副本,而是对该对象的引用的副本。
有关更多信息,请参见ref keyword上的文档。
答案 1 :(得分:2)
这是因为在C#中,值和引用类型都通过值传递,即传递副本。我们需要明确告知需要在何处通过引用传递它们。
对于引用类型,将传递引用副本。因此,在您的方法内部交换它们不会影响调用方法外部的原始对象引用,因为调用方法外部的变量与方法内部的变量具有不同的引用副本,尽管它们都指向同一对象并更改状态。它们中的任何一个都会影响物体。
@John pointed使用ref
来通过引用传递引用。