关于值类型参数传递和引用类型传递传递以及ref和out关键字用法,真心不是很理解,哪位高手帮忙指点迷津~谢谢

解决方案 »

  1.   

    值类型,基本类型(比如int、float)+结构体,特别的string是引用类型,但是string是只读的,对string的修改会生成另一个string,所以string看起来很像值类型。其余的对象就是引用类型。ref,用来传入参数,并且可以由函数修改后传出,out,只能用于传出,不能将调用者的参数传入函数。
      

  2.   

    using System;class Program
    {
        static void Foo(TestClass c)
        {
            c.i = 100;
            c.s = "WorldHello";
        }    static void Foo(out Int32 i)
        {
            i = 100;
        }    static void Foo(String s)
        {
            s = "WorldHello";
        }    static void Foo(ref String s)
        {
            s = "WorldHello";
        }    static void Main(string[] args)
        {
            // TestClass本来就是引用了
            TestClass c = new TestClass();
            Foo(c);
            Console.WriteLine(String.Format("{0},{1}", c.i, c.s));        // out进入函数时不用先给i赋值,但离开函数时必须给i赋值
            Int32 i;
            Foo(out i);
            Console.WriteLine(i);        // 虽然String是引用类型,但String是不可变的,所以仍然输出HelloWorld
            String s1 = "HelloWorld";
            Foo(s1);
            Console.WriteLine(s1);        // ref进入函数时必须给s2赋值,引用再引用?,最后输入出WorldHello
            String s2 ="HelloWorld";
            Foo(ref s2);
            Console.WriteLine(s2);        // 属性不是变量,是方法,属性不能ref out
            Foo(out c.ii);
            Foo(ref c.ss);        Console.ReadKey();
        }
    }public class TestClass
    {
        public Int32 i = 200;
        public String s = "HelloWorld";    public Int32 ii
        {
            get { return i; }
            set { ii = value; }
        }    public String ss
        {
            get { return s; }
            set { s = value; }
        }
    }
      

  3.   

    ref和out相当于是C++语言里面的传递变量的指针,如果参数是引用类型,本来就是指针了,如果再加上ref,传递的就是指向指针的指针,
      

  4.   

    《C#入门经典》第六章里就有讲过ref和out的区别,书中讲的还是比较好理解的。
      

  5.   


    说得好,如果你用ref修饰一个对象引用的参数,那么函数可以将这个对象引用指向另一个对象。而如果你不是用ref,那么你可以修改这个对象的状态——这导致实参的那个对象状态的更改,但是当你将这个引用指向另一个对象的时候,实参指向的对象不会修改。