日期:2014-05-17  浏览次数:20841 次

C# 关于引用类型按值传递的问题
引用类型按值传递时,传递的对象的引用地址,怎么会改变原来对象的引用指向啊!!!


------解决方案--------------------
你理解错了,建议你看看C#书上关于引用是怎么说的!
------解决方案--------------------
在.net里byref是最慢的(而不是最快的)。对于byvalue而言,就是把引用本身传入参数栈就完了。而对于byref而言,在被调用方法执行完了之后,还要把参数的值赋值给调用者变量,所以byref要比byval更慢。
------解决方案--------------------
其实C#平时的传递引用是一个假象。真正的传递引用需要使用ref 或 out

引用对象按值传递的时候,传递的是引用所指向的对象,不能改变原来引用的指向。

------解决方案--------------------
还要把参数的值赋值给调用者变量 --〉 还要把参数的新的引用值赋值给调用者变量(引用)

注意,这不是c/c++。因此byref的概念在.net和在c中完全不同!
------解决方案--------------------
C# code

    class Program
    {
        static void Main(string[] args)
        {
            MyTest mt = new MyTest();
            //引用类型按值传递,传递的是该引用所指向的对象。
            Func(mt);
            //可以改变其值(因为是同一对象),但不能让引用指向新的对象(因为没有传递mt的引用过去)
            Console.WriteLine(mt.Name);//结果输出:张三

        }

        static void Func(MyTest test)
        {
            test.Name = "张三";
            test = new MyTest();
            test.Name = "李四";
        }
    }

    class MyTest
    {
        public string Name;
    }