如果在方法声明参数中未使用ref或out关键字,在方法中更改参数的值,当控制传递回调用过程时,不会保留更改的值;我们可以通过方法参数关键字,更改这种行为。
1.ref2.out3.paramsref和out关键字都可以使参数按引用传递,当控制权传递回调用方时,在被调方法中对参数所做的任何修改都将反映在该变量中,在使用时,都要求方法定义和调用方法显式使用ref或out关键字,但是它们有如下的几个区别:a.当使用ref关键字时,传递到ref参数的变量必须事先初始化,而与 out不同,out 的参数在传递前不需要初始化,请看示例: static void Main(string[] args) { string aa = "0"; //传递给ref参数前,必须先初始化 TestRef(ref aa); Console.WriteLine(aa); } public static void TestRef(ref string refTest) { refTest = "1"; }结果输出 "1" static void Main(string[] args) { string aa; //传递给out参数前,不必先初始化 TestRef(out aa); Console.WriteLine(aa); } public static void TestRef(out string refTest) { refTest = "1"; }结果输出"1"ref和out在运行时的处理方式不同,但是在编译的时候的处理方式确实相同的,所以下面的两个函数是相同的public void SampleMethod(ref int i) { }public void SampleMethod(out int i) { }在使用ref或out传递数组参数时,我们也要注意:使用out传递时,在被调用方法中需要对数组进行赋值,这个是需要注意的地方;使用ref时,和上述的要求一样,需要先进行初始化,即由调用方明确赋值,所以不需要由被调用方明确赋值,请看代码: static void Main(string[] args) { string[] aa =null;//明确赋值 TestRef(ref aa); Console.WriteLine((aa!=null&&aa.Length>0)?aa[0]:"null"); } public static void TestRef(ref string[] refTest) { //这里不要明确赋值 if (refTest != null) { if (refTest.Length > 0) { refTest[0] = "A"; } } } static void Main(string[] args) { string[] aa ;// TestRef(out aa); Console.WriteLine((aa!=null&&aa.Length>0)?aa[0]:"null"); } public static void TestRef(out string[] refTest) { refTest = new string[] { "a", "b", "c", "d" }; //由于out参数不需要在传递前进行初始化,这里需要对对参数进行赋值 if (refTest != null) { if (refTest.Length > 0) { refTest[0] = "A"; } } }使用out参数,我们可以让方法有多个返回值,如: static void Method(out int i, out string s1, out string s2) { i = 44; s1 = "I've been returned"; s2 = null; } static void Main() { int value; string str1, str2; Method(out value, out str1, out str2); // value is now 44 // str1 is now "I've been returned" // str2 is (still) null; }params关键字:params 关键字可以指定在参数数目可变处采用参数的方法参数,在使用时要注意几点:1.在方法声明中的params关键字后,不允许再出现其他参数2.在方法声明中只允许使用一个params关键字static void Main(string[] args) { TestParams(1, "a", "cc");//方式1 object[] obj = new object[] {1,"a","c" };//数组也可以传递过去,只要类型匹配 TestParams(obj); }
public static void TestParams(params object[] para) { for (int i = 0; i < para.Length; i++) { Console.WriteLine(para[i]); } }