包含引用类型的值类型
在值类型中包含引用类型成员,当对其进行复制或作为参数传递时,其中的引用类型则是将引用的指向复制过来,并没有产生副本(浅复制)。
按值传递的引用类型
引用类型同值类型一样,都可以作为参数传递,但与值类型有很大的不同。例如:
定义一个Person类
class Person
{
public string personName;
public int personAge;
public Person(string name, int age)
{
personName = name;
personAge = age;
}
public void Display()
{
Console.WriteLine("Name: {0}, Age: {1}", personName, personAge);
}
}
将Person类对象按照值类型进行传递
static void SendAPersonByValue(Person p)
{
//修改对象的属性
p.personAge = 99;
//将对象p指向另一个对象
p = new Person("Nikki", 99);
}
static void Main(string[] args)
{
Person mel = new Person("Mel", 23 );
SendAPersonByValue(me1);
mel.Display();
}
输出结果:
Name: Mel, Age: 99
从输出结果可以看出,将引用类型对象作为值传递时,的确是将该对象的引用传递过去了,所以,在子方法中对引用成员的修改会影响主方法中的该引用类型成员,但是在子方法中讲引用参数指向另个对象并未起作用,也就是说无法把引用重新赋值给新的对象,当将引用类型作为值类型传递时,此时该引用类型转化为指针常量,就像数组名一样,只能改变其成员的值,但不能改变该常量指针的指向。
按引用传递引用类型
与前面最大的区别在于,当将引用类型以引用的方式传递时,不仅可以改变该引用类型的状态数据,还可以改变其所指向的对象。
static void SendAPersonByValue(ref Person p)
{
//修改对象的属性
p.personAge = 99;
//将对象p指向另一个对象
p = new Person("Nikki", 99);
}
static void Main(string[] args)
{
Person mel = new Person("Mel", 23 );
SendAPersonByValue(me1);
mel.Display();
}
输出结果:
Name: Nikki, Age: 99