1.引入問題
實例:寫一個方法,計算int數組中的每個元素的總和以及最大值與最小值
* 其目的是返回3個值類型的變量, 那麼問題來了,但是方法return只能返回一個值 ,這時就可以用ref和out來修飾參數
示例代碼(沒有修飾):
1 static void Main(string[] args) 2 { 3 4 5 int[] arr = { 56,31,2,89,76}; 6 int sum = 0, max = 0, min = 0; 7 GetValue(arr, sum, max, min); 8 9 Console.WriteLine("總和:" + sum + ",最大值:" + max + ",最小值:" + min); 10 } 11 12 public static void GetValue(int [] arr , int sum, int max, int min) 13 { 14 sum = 0; 15 max = arr[0]; 16 min = arr[0]; 17 18 for(int i = 0; i < arr.Length; i++) 19 { 20 sum += arr[i]; 21 if(max<arr[i]) 22 { 23 max = arr[i]; 24 } 25 if(min>arr[i]) 26 { 27 min = arr[i]; 28 } 29 30 } 31 32 } View Code
示例代碼(修飾後):
1 static void Main(string[] args) 2 { 3 4 5 int[] arr = { 56,31,2,89,76}; 6 int sum = 0, max = 0, min = 0; 7 GetValue(arr,ref sum, ref max, ref min); 8 9 Console.WriteLine("總和:" + sum + ",最大值:" + max + ",最小值:" + min); 10 } 11 12 public static void GetValue(int [] arr , ref int sum, ref int max, ref int min) 13 { 14 sum = 0; 15 max = arr[0]; 16 min = arr[0]; 17 18 for(int i = 0; i < arr.Length; i++) 19 { 20 sum += arr[i]; 21 if(max<arr[i]) 22 { 23 max = arr[i]; 24 } 25 if(min>arr[i]) 26 { 27 min = arr[i]; 28 } 29 30 } 31 32 } View Code結果證實: 沒有用ref和out傳遞的值類型參數,將傳遞的是棧內存裡的值內容
* 用ref和out修飾後,值類型傳遞將傳遞棧內存的地址,也就導致了形參和實參(實參給形參賦值),只向一個地址,
* 形參通過方法改變後,實參變量的值頁將會改變
2.ref=references---引用
* 注意:1.傳參的參數必須在方法調用之前前聲明並賦值(先賦值在使用)
2.傳參實參要加ref,方法聲明的形參也要加ref,“門當戶對”。
3.ref傳遞的參數其實沒有真正的創建一個新的變量,是將實參和形參共享一個地址的內存
3.out=輸出參數
* 注意:1.傳參的參數可以只聲明不賦值,但是在調用的方法體內,必須為其賦值(在方法體內必須賦值)
2.傳參實參要加out,方法聲明的形參也要加out,“門當戶對”。
3.out傳遞的參數其實沒有真正的創建一個新的變量,是將實參和形參共享一個地址的內存
4.ref和out的區別:
ref傳遞的參數必須賦值在使用(在外賦值)
out可以只聲明不賦值,但是在方法體內必須賦值(在內賦值)
5.基礎概念:
1.參數傳遞,默認都是傳遞棧空間的內容
2.如果添加了ref或out修飾,那麼將會傳遞棧空間的地址,不再是棧空間的內容
傳遞過程:形參是實參的一種規范,形參也是一個獨立的變量,將會把實參賦該形參