一、参数的一般传递方式
在c#中,除非使用ref或者out前缀,所有参数都通过值来传递。变量的栈数据会完整复制到目标参数中。分为以下3种情况:
1、 引用类型的变量只包含对象所在的内存地址,将要复制的是内存地址而不是对象本身,所以对底层对象的修改会保留。如果在方法内部将内存地址指向一个新对象,
则方法结束后在方法中所作的修改会被丢弃。
1 class Program 2 3 { 4 5 static void Main(string[] args) 6 7 { 8 9 Employee myE = new Employee() { id=4}; 10 11 Console.WriteLine("初始化为:"+myE.id); 12 13 testMethod(myE); 14 15 Console.WriteLine("退出方法后:"+myE.id); 16 17 Console.ReadLine(); 18 19 } 20 21 static void testMethod(Employee myE) 22 23 { 24 25 //myE.id = 5; 26 27 myE = new Employee() { id = 5 }; 28 29 Console.WriteLine("更改为:"+myE.id); 30 31 } 32 33 } 34 35 class Employee 36 37 { 38 39 public int id { get; set; } 40 41 }
该程序输出为

2、 值类型对象包含的是实际数据,传递给方法的是数据本身的副本,对值类型对象的修改在方法结束后会被丢弃。
3、String类型在实际使用中当做值类型对待。
二、参数的特殊传递方式
1、ref参数
作用:迫使值参数通过引用传送给方法。
2、out参数
作用:在参数未初始化的情况下,在一个函数中输出多个值。隐含ref。C#要求变量在被引用前必须初始化。尽管在传递前,可以用没有意义的值初始化他们,
然后用ref引用传递,但有时会引起混乱。用out可以使参数在未初始化情况下使用,逻辑性更强。
3、params数量可变参数
作用:自动把参数转为数组。调用方法有两种,见示例。
1 static string Combine(params string[] paths) 2 3 { 4 5 string result = string.Empty; 6 7 foreach (string path in paths) 8 9 { 10 11 result = System.IO.Path.Combine(result, path); 12 13 } 14 15 return result; 16 17 } 18 19 static void test() 20 21 { 22 23 //调用方法1,直接输入,如果不使用params前缀就不能用这种方式 24 25 string path1 = Combine("", "", ""); 26 27 //调用方法2,string数组,不使用params前缀也能用这种方式 28 29 string path2 = Combine(new string[] {"","","" }); 30 31 }
三、传递参数注意事项:
1、 属性不是变量,因此不能传给out 或ref参数
2、 除非使用out前缀,所有参数必须在使用前初始化。
3、 out参数必须在函数结束前赋值,赋值null也可以。

浙公网安备 33010602011771号