1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace ConsoleApplication1 7 { 8 class Program 9 { 10 /* 先来了解一下什么是实参, 什么是形参. 11 所谓形参其实也就是说函数定义的时候所带的参数. 比如 static void Myfuntion(int i , int t) 其中 int i and int t 都是形参. 12 * 而实参呢? 实参代表的是将要传入函数里面进行运算的两个参数, 可以是变量,也可以是常量.只要与形参类型相同即可*/ 13 14 // 函数分为传值与传址两种方式. 传值不影响实参的数据,传址则会影响实参的数据. 下面用几段代码来示例 15 //在使用传值或者传址的选择上应当遵循这样一个规则. 16 //1. 传值是将形参的内容复制一份给实参. 17 //2. 传址是将形参与实参同时指向一个地址. 18 //如果在数据较大的情况下使用传值的方式必然会影响程序性能, 所以当数据较大时可以使用传址的方式.使用传址的方式会让程序的效率大大提升. 19 static void Myfuntion(int i , int t) //这个函数将以传值的方式运行 20 { 21 if (i > t) 22 i += 5; 23 else 24 t += 5; 25 } 26 27 static void Myfuntion1(ref int i, ref int t) // 这个函数将会以传址的方式进行运算. 因为前面加了ref关键字, 函数只要加了ref关键字就会是以传址的方式进行运算 28 { 29 if (i > t) 30 i += 5; 31 else 32 t += 5; 33 } 34 35 static void Myfuntion2(int[] array) //这里注意, 这个函数没有带ref关键字, 但是也是以传址的方式进行运算. 因为在C#中,引用类型都是以传址的方式进行运算,而array属于数组, 数组又属于引用类型,所以.... 36 { 37 for (int i = 0; i < array.Length; i++) 38 { 39 array[i] = 40; 40 } 41 } 42 43 static void Myfuntion3 (int i , int t , out int s) //这个函数虽然返回值为Void(代表没有返回值) , 其实有返回值 因为我们加了一个新的关键字, out , 这个关键字能够将 s 单独返回. 同样out关键字也是以传址的方式进行运算的. 还有,out 参数可以不用赋值,即使你赋值了也会被忽略 44 { 45 s = 50; 46 if (i > t) 47 i += 5; 48 else 49 t += 5; 50 } 51 52 static void Main(string[] args) 53 { 54 // 现在我们来使用上面定义的四个函数,看看效果是怎样的. 55 int a = 10, b = 15, c; 56 //1. 传值方式的函数 57 Myfuntion(a, b); // 这个时候a and b 还是等于 10 和 15 , 因为函数中的形参虽然改变结果了. 但是不会影响到实参. 58 Console.WriteLine("a : {0} and b : {1}",a,b + "\n"); 59 60 // 2. 传址方式的函数 61 Myfuntion1(ref a, ref b); //这里要注意, 函数中使用了ref关键字,在调用的时候也要使用ref关键字. 此时的结果应该是a = 10 b = 20 因为上面的代码是传址方式的, 形参发生了改变也会影响到实参 62 Console.WriteLine("a : {0} and b : {1}",a,b + "\n"); 63 64 // 3.隐式的传址方式函数. 65 int[] My = new int[5]; //定义一个数组并且为它赋值 66 for (int i = 0; i < My.Length; i++) 67 { 68 My[i] = 30; 69 } 70 // 现在调用函数 71 Myfuntion2(My); //结果可想而知, my的每一位都会等于 50 72 foreach (int w in My) 73 { 74 Console.WriteLine(w); 75 Console.WriteLine(); 76 } 77 78 // 4. out 参数函数 79 Myfuntion3(a, b, out c); //同样, 和ref一样在调用的时候也需要加上关键字 80 Console.WriteLine(c); // c应该会等于 50 81 //我们试试把C赋值了之后再调用函数,看看会发生什么. 82 c = 90; 83 Myfuntion3(a, b, out c); 84 Console.WriteLine(c); //还是会等于50; 85 } 86 } 87 } 88 // 下面是运算结果 89 90 /* a : 10 and b : 15 91 ------------------- 92 a : 10 and b : 20 93 ------------------ 94 40 95 96 40 97 98 40 99 100 40 101 102 40 103 ---------------------- 104 50 105 ---------------------- 106 50 107 108 * */