using System;
public class Test1
{
public static void Main()
{
int num = 0;
Person p = new Person("Li");
A1(p, num);
Console.WriteLine("{0},{1}", p.name, num);
}
static void A1(Person p, int num)
{
p = new Person("Wang");
num = 1;
}
}
public class Person
{
public string name;
public Person(string name)
{
this.name = name;
}
}
其实这两个参数都是值传递,num就不用说了,它是值类型,所以传递到方法中的是它的副本,而p是引用类型,但是它没有加ref或者out,所以它是以值传递引用类型,引用类型的变量不直接包含其数据;它包含的是对其数据的引用。当通过值传递引用类型的参数时,有可能更改引用所指向的数据,如某类成员的值。但是无法更改引用本身的值;也就是说,不能使用相同的引用为新类分配内存并使之在块外保持。
在楼主的示例中,p为引用类型,在未使用 ref 参数的情况下传递给方法A1。在此情况下,将向方法传递指向p的引用的一个副本。但是在A1方法中使用 new 运算符来分配新的内存部分,将使A1中的p引用新的Person,因此,这之后的任何更改都不会影响原始Person p(它是在 Main 内创建的)。实际上,本示例中创建了两个Person对象,一个在 Main 内,一个在 A1 方法内