引用类型传参不加 ref 的注意事项

public class MyClass
    {
        public int Value;
    }

    //MSDN: http://msdn.microsoft.com/zh-cn/library/s6938f28%28v=vs.80%29.aspx
    
//引用类型的变量不直接包含其数据;它包含的是对其数据的引用。当通过值传递引用类型的参数时,有可能更改引用所指向的数据,如某类成员的值。
    
//但是无法更改引用本身的值;也就是说,不能使用相同的引用为新类分配内存并使之在块外保持。
    
//若要这样做,应使用 ref 或 out 关键字传递参数。

    
// 引用类型参数没有加ref 试图将参数重新分配到不同的内存位置时,该操作仅在方法内有效,并不影响原始变量
    class Program
    {
        static void Main(string[] args)
        {
            MyClass m = new MyClass();
            m.Value = 1;

            Console.WriteLine(m.Value);//Step 1-->1
            Test1(m);
            Console.WriteLine(m.Value);//Step 3 --> 50

            Test2(ref m);
            Console.WriteLine(m.Value); //Step 5 -->100
            Console.ReadLine();
        }

        public static void Test1(MyClass m)
        {
            m.Value = 50;
            m = new MyClass();
            m.Value = 200;
            Console.WriteLine("Func: Test1, m Value = {0}", m.Value);// Step 2 --> 200
        }

        public static void Test2(ref MyClass m)
        {
            m.Value = 60;
            m = new MyClass();
            m.Value = 100;
            Console.WriteLine("Func: Test2, m Value = {0}", m.Value);//Step 4 -->100
        }
    }
posted @ 2011-10-13 11:38  Aleax  阅读(307)  评论(1编辑  收藏  举报