如果要使用ref和out,在定义函数和调用函数的时候必须声明该参数为ref或out形式,对值类型和引用类型都可以同样使用;
不同的是:
ref在于将值类型参数当作引用型参数传递到函数,并且在函数内部的任何改变也都将影响函数外部该参数的值;因此ref必须在函数体外初始化。
out在于获取函数的返回值,由函数内部计算得到的值再回传到函数外部参数,因此必须在函数内部对该参数赋值,这样函数外部赋值将变得毫无意义。也就是说,out型的参数在函数体内不能得到外面传进来的初始值。
动态参数params是数组型参数,在方法声明中的 params 关键字之后不允许任何其他参数,并且在方法声明中只允许一个 params 关键字,但在params前面可以声明其它类型的参数;当调用时,可以直接传递数组名称,并且这个数组可以是空数组,也可以传递数组中的元素。数组的大小可以改变,这就是使用params的好处。
下面是ref、out和params用法的小例子:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            MyClass mc = new MyClass();
           
            string j = "10";//必须赋值,如果不赋值的话就会报错
            mc.myref(ref j);//把j的值传递到myref中,并打印结果得 10
            Console.WriteLine(j);//带回myref中对参数赋的值,得到结果 100
           
            int i = 10;//对i赋值毫无意义,
            mc.myout(out i);//调用函数内部的值 100
            Console.WriteLine(i);// 毫无疑问结果也是 100
            //int[] arrint = new int[] { };//可以定义一个空数组,也可以传递
            int[] arrint = new int[] { 1, 2, 3 };
            mc.myparams(arrint);//可以直接传递数组名
            mc.myparams( 4, 5, 6, 7);//直接传递数组中的元素
        }
    }
    class MyClass
    {
        //ref作参数
        public void myref(ref string i)
        {
            Console.WriteLine(i);
            i = "100";
        }
        //out作参数
        public void myout(out int i)
        {
            i = 100;//必须在函数内部对该参数赋值
            Console.WriteLine(i);
        }
        //动态参数
        public void myparams(params int[] arrint)
        {
            foreach (int i in arrint)
            {
                Console.WriteLine(i);
            }
        }
    }
}