如下所示class Program
    {
        static void Main(string[] args)
        {
            Person p = new Person();
            p.Name = "Jack";
            Change(p);
            Console.Write(p.ToString());
        }
        static void Change(Person p)
        {
            Person c = new Person();
            c.Name = "Mary";
            p = c;
        }
    }    class Person
    {
        private string name;        public string Name
        {
            get { return name; }
            set { name = value; }
        }
        public override string ToString()
        {
            return this.name;
        }

    }  
最后的输出竟然是jack,明明是个传引用,为什么结果会是如此呢,实在有点搞不明白我后来测试了一下,问题好像是出在静态函数的关系,同样的调用 Person p = new Person();
            p.Name = "Jack";
            Change(p);
            Console.Write(p.ToString());
这几句话,如果放在实例函数里面,结果就会是mary。但是我很想知道原理,望高手赐教(分数没了,实在不好意思)

解决方案 »

  1.   

    ref 关键字使参数按引用传递...
      

  2.   

    。。楼上最好看看ref的使用方法,一般在值传递的时候,才会用到ref 来将值返回。传对象是不需要ref的
      

  3.   

    static   void   Change(Person   p) 
                    { 
                            Person   c   =   new   Person(); 
                            c.Name   =   "Mary"; 
                            p   =   c; 
                    } 
    按值傳遞
      

  4.   

    楼上的这个static是无关紧要的,我把staic改成public ,一样返回jack
      

  5.   

    我感觉关键在于调用change函数的位置,如果是在staic里面调用,就会编程值传递,如果是再普通的实例函数里面调用,就是传引用。
    但是我不知道为什么
      

  6.   

    是这样的:
    在传值的时候,如果没有ref关键字,那么传值都是按值传递,也就是作了一个副本在方法中使用
    但虽然是按值传递,作为引用类型,如果被传入的时候,通常副本都是创建的"浅表副本",即引用不同,但实际字段的引用相同.因此在方法中修改字段的值通常会将该对象的状态修改.
    不过就算是传入引用类型,如果是按值传递,在方法中通过arg = value这种方式改变值的方式,也不会改变方法外,被传入的参数.
    原理就是:方法外的对象引用与方法内的对象引用是两个不同的引用对象,虽然它们都指向同一个地址.
    当简单赋值的时候,实际上是方法内的引用被指向了新地址,而方法外的引用却没有改变,因此离开方法之后,方法外部的引用仍然指向了原有地址
    当然,如果是用ref或out进行按引用传值,那么简单赋值就会更改方法外部的引用的实际指向.
      

  7.   

    。。楼上最好看看ref的使用方法,一般在值传递的时候,才会用到ref   来将值返回。传对象是不需要ref的
    --------------
    lz你看过书吗?或者你看的什么书啊?
      

  8.   

    不好意思,我前面看错了,好像无论放在静态还是实例,都会得到jack的答案。但是传person对象,难道不是传引用吗?
      

  9.   

    哦,非常不好意思啊,我太久没看这方面的东西,把概念搞混了,呵呵。sorry,sorry。