你必须知道的值传递和引用传递

C#中默认使用的是值传递,加ref关键词则标记为引用传递。两者的差别是值传递是传递标识符所代表的变量的副本,而引用传递是传递的本身。以此概念来推敲值类型和引用类型在两种不同传递方式下的区别,这可能是很多人都忽视的,下面的例子表达了这些区别。
using System;

namespace TestMethodParams
{
    /// <summary>
    /// Class1 的摘要说明。
    /// </summary>
    class Class1
    {
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main(string[] args)
        {
            //
            // TODO: 在此处添加代码以启动应用程序
            //

            int i = 0;
            //值类型的值传递
            ValueTypeTransByVale(i);
            Console.WriteLine("值类型的值传递:");
            Console.WriteLine(i);

            //值类型的引用传递
            ValueTypeTransByRef(ref i);
            Console.WriteLine("值类型的引用传递:");
            Console.WriteLine(i);

            MyClass m = new MyClass();
            //引用类型的值传递1
            m.X = 0;
            RefTypeTransByValue1(m);
            Console.WriteLine("引用类型的值传递1:");
            Console.WriteLine(m.X);

            //引用类型的值传递2
            m.X = 0;
            RefTypeTransByValue2(m);
            Console.WriteLine("引用类型的值传递2:");
            Console.WriteLine(m.X);

            //引用类型的引用传递1
            m.X = 0;
            RefTypeTransByRef1(ref m);
            Console.WriteLine("引用类型的引用传递1:");
            Console.WriteLine(m.X);

            //引用类型的引用传递2
            m.X = 0;
            RefTypeTransByRef2(ref m);
            Console.WriteLine("引用类型的引用传递2:");
            Console.WriteLine(m.X);

            Console.Read();
        }

        static void ValueTypeTransByVale(int i)
        {
            i = 100;
        }

        static void ValueTypeTransByRef(ref int i)
        {
            i = 100;
        }

        static void RefTypeTransByValue1(MyClass m)
        {
            m.X = 100;
        }

        static void RefTypeTransByValue2(MyClass m)
        {
            m = new MyClass();
            m.X = 100;
        }

        static void RefTypeTransByRef1(ref MyClass m)
        {
            m.X = 100;
        }

        static void RefTypeTransByRef2(ref MyClass m)
        {
            m = new MyClass();
            m.X = 100;
        }
    }

    public class MyClass
    {
        public int X;
    }
}

posted on 2008-10-02 11:31  栖息的熊  阅读(708)  评论(2编辑  收藏  举报

导航