方法中参数的类型详细

  1. in型参数 
    in型参数通过值传递的方式将数值传入方法中。即我们在Java中常见的方法

  2. ref型参数 
    该种类型的参数传递变量地址给方法(引用传递),传递前变量必须初始化。 
    该类型与out型的区别在与: 
    1).ref型传递变量前,变量必须初始化,否则编译器会报错,而out型则不需要初始化 
    2).ref型传递变量,数值可以传入方法中,而out型无法将数据传入方法中。换而言之,ref型有进有出,out型只出不进。

  3. out型参数 
    与ref型类似,仅用于传回结果。 
    注意: 
    1). out型数据在方法中必须要赋值,否则编译器会报错。 
    eg:如下图若将代码中的sum1方法的方法体 
    改为 a+=b;则编译器会报错。原因:out型只出不进,在没给a赋值前是不能使用的 
    改为 b+=b+2;编译器也会报错。原因:out型数据在方法中必须要赋值。 
    2). 重载方法时若两个方法的区别仅限于一个参数类型为ref 另一个方法中为out,编译器会报错 
    eg:如下图若将代码中 
    方法名sum1 改为sum(或者将方法名sum改为sum1),编译器会报错。 
    Error 1 Cannot define overloaded method ‘sum’ because it differs from another method only on ref and out 
    原因:参数类型区别仅限于 为ref 与为out 时,若重载对编译器而言两者的元数据表示完全相同。

具体区别见代码

class C
    {
        //1. in型参数
        public void sum(int a, int b) {
            a += b;
        }
        //2. ref型参数
        public void sum(ref int a, int b)
        {
            a += b;
        }
        //3. out型参数
        public void sum1(out int a, int b)
        {
            a = b+2;
        }
        public static void Main(string[] args)
        {
            C c = new C();
            int a = 1, b = 2;
            c.sum(a,b);
            Console.WriteLine("a:{0}", a);
            a = 1; b = 2;
            c.sum(ref a, b);
            Console.WriteLine("ref a:{0}", a);
            a = 1; b = 2;
            c.sum1(out a, b);
            Console.WriteLine("out a:{0}", a);
        }
    }

输出结果: 
输出结果 
从代码也可以看出,in型参数为值传递,所以当将变量a传入方法时,变量a的值并不会发生变化。而ref型参数,由于是引用传递,将变量的值和地址都传入方法中故变量值改变。out型无法将变量的值传入。但可以将变量的地址传入并为该地址上的变量赋值。

posted @ 2017-07-28 10:36  守望阳光01  阅读(596)  评论(0编辑  收藏  举报