图解C#传值与传引用
向方法传递参数有按值传递和按引用传递两种方式,按值传递将导致被调用方法有自己的该参数的私有拷贝。如果参数是值类型,被调用方法将拥有自己的该实例的私有拷贝。如果参数是引用类型,那么被调用的方法拥有该引用类型的引用的私有拷贝。按引用传递在C#中是用ref 或者out修饰的方法参数,按引用传递导致被调用方法得到一个托管指针,该指针指向调用方的变量。闲话就不多说了,这都是大家熟悉的不能再熟悉的东西。下面写个小demo,把这些概念图形化一下。
public class Book
{
public string BookName { get; set; }
public string Author { get; set; }
public double Price { get; set; }
}
public static string GetInfos(Book book, int count)
{
return string.Format("BookName:{0},Author:{1},Price:{2} and Count:{3}",
book.BookName, book.Author, book.Price, count);
}
public static string ChangeInfos(ref Book book, ref int count)
{
book = new Book
{
BookName = "CLR Via C#",
Author = "Jeffrey Richter",
Price = 68.00
};
count = 10;
return string.Format("BookName:{0},Author:{1},Price:{2} and Count:{3}",
book.BookName, book.Author, book.Price, count);
}
static void Main(string[] args)
{
Book book = new Book
{
BookName="Essential .Net",
Author="Don Box",
Price=48.00
};
int n = 5;
Console.WriteLine(GetInfos(book, n));
Console.WriteLine("-------------------------------------------------------------");
Console.WriteLine(ChangeInfos(ref book, ref n));
Console.WriteLine("-------------------------------------------------------------");
Console.WriteLine(GetInfos(book, n));
Console.ReadLine();
}
当调用GetInfos时,用的是按值传递方式,book是引用类型,n为值类型。参数传递示意图:
当调用ChangeInfos时,用的是按引用传递,ChangeInfos的两个参数都给托管指针,保存的地址指向Main方法中的两个变量,ChangeInfos修改两个参数后的示意图
程序的运行结果: