图解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修改两个参数后的示意图

程序的运行结果:

posted @ 2011-08-23 08:16  秋无语  阅读(1234)  评论(4编辑  收藏  举报