out關鍵字會導致參數通過引用來傳遞,通俗點說,就是往外傳值的。
out參數的作用:用於以內部變量為外部變量賦值的,out一般適用於某個方法不只是使用return返回單個值,而是需要有多個返回值的情況。
out參數的使用需要注意以下幾點:
1)out參數傳遞的變量在傳遞之前不需要對其進行初始化。
分析:在調用方法之前,對out參數傳遞的變量只需聲明,可以賦值也可以不賦值,不過反正都是要在調用時被覆蓋掉,所以大可不必賦值,因為賦值了雖然不會報錯,但卻根本也沒有用處,沒必要多此一舉!(詳見以下代碼)
2)如果方法的參數有使用out關鍵字修飾時,在調用該方法時,記住也要在out參數傳遞的變量前面加上out才行。
分析:加上out能表明這個參數不是傳入的,而是傳出值的,但是out修飾的參數依然可以傳入值;不加out關鍵字,會使得該 參數成為無效參數而報錯。
3)方法使用了out參數傳遞變量時,就是要返回值,所以必須在方法返回值或方法結束之前,對out所修飾的變量進行賦值。
1 static void Main(string[] args) 2 { 3 int rst; //out修飾的變量在調用之前只需聲明即可 4 int num=8; 5 if (isMod(num, out rst)) //記住加上out修飾變量 6 { 7 Console.WriteLine("{0}是偶數,{0}/2={1}", num, rst); 8 } 9 else 10 { 11 Console.WriteLine("{0}不是偶數",num); 12 } 13 Console.ReadKey(); 14 } 15 16 public static bool isMod(int number,out int result)//通過參數返回值 17 { 18 if (number % 2 == 0) 19 { 20 result = number / 2; //方法結束之前必須對result賦值 21 return true; 22 } 23 else 24 { 25 result = 0; //方法結束之前必須對result賦值 26 return false; 27 } 28 }
在上述代碼中,out 修飾了rst 和result 兩個變量,就相當於在它們之間建立了一種聯系,對result 進行賦值也就是對rst進行賦值,等於把方法中的局部變量的值返出去了,成功達到了通過參數返值的目的。
4)另外,若是要在方法內部使用out 修飾的變量,如上述程序,在isMod 方法中使用result 之前,必須先對其進行賦值才能使 用。雖然可能在isMod 方法被調用之前,已經對rst 賦值,比如 rst=2,當參數rst 以out 形式傳入時,result 雖然也能收到rst 傳來的值,即調用時result 也等於2,然而,在isMod 方法裡想要使用result 變量時,還是必須先要對它賦一次值,這就顯得調用之前的賦值變得毫無意義。
ref 關鍵字,同out一樣,可以使得參數通過引用來傳遞。換句話說,ref能夠讓你直接對原來那個數進行操作,而不是將原數復制一份,對那個復制項進行操作。
ref參數的作用:與out不同的是,它可以雙向傳值,主要適用於場景內部對外部的值進行改變的情況。
ref參數的使用需要注意以下幾點:
1)ref參數傳遞的變量在傳遞之前一定要對其進行初始化賦值。
分析:ref本來就適用於場景內部對外部的值進行改變的情況,所以在傳參之前,一定要對其賦初值,才能有值傳過去。
2)如果方法的參數有使用ref關鍵字修飾時,在調用該方法時,記住也要在ref參數傳遞的變量前面加上ref才行。
分析:加上ref能表明這個參數既是傳入的,又可以是傳出值的,不加ref關鍵字,會使得該參數成為無效參數而報錯,num和number兩個變量都使用了ref來修飾,使得number指向了num,所以在Test方法中對number進行操作時,就是對num進行操作。(詳見以下代碼)
1 static void Main(string[] args) 2 { 3 int num = 100; //ref修飾的變量,必須對其賦初值 4 Test(ref num); //記住加上ref變量 5 Console.WriteLine(num); 6 Console.ReadKey(); 7 } 8 9 public static void Test(ref int number) 10 { 11 int numA = number; 12 number = 2; //不一定要賦值 13 }
3)方法使用了ref參數傳遞變量時,不同於out,沒有要求一定在方法返回值或方法結束之前,對ref所修飾的變量進行賦值,所以可以不賦值。
4)另外,若是要在方法內部使用ref修飾的變量,如上述程序,在Test方法中使用number之前,因為要求已經對即將傳入的num,賦了初值100,不同於out,此時可以在Test方法內直接使用number變量,並且,當參數num以ref形式傳入時,number就能收到num傳來的值,即調用時number也等於100,之後改變number的值,也同時改變了num的值。
params 是關鍵字,可以使得在參數個數可變處采用參數的數組型參數,比如 int sum(params int[] values)。
可變參數的作用:使得個數不確定的可變參數以數組的形式傳遞,適合於方法的參數個數未知的情況時,用於傳遞大量的數組集合參數。
可變參數在使用時需注意:
1)不允許將params修飾符與ref和out修飾符組合起來使用。
2)當方法的參數列表中有多個參數時,params修飾的參數必須放在最後,不能放在前面,以免程序不好確定參數究竟有多少個而報錯。比如: int sum(string name,params int[] values)
3) 一個方法當然可以包含可變參數和不變參數,兩個可以同時使用。
這樣,有了可變參數,就可以在某些情況下根據特定的需要來確定方法的參數個數。
這是我的第一篇學習日記,知識點可能講的不是很細,但其中的每一點都是我自己歸納出來的,以前只學過點C++基 礎,沒接觸過C#,更不知道有Out參數、Ref參數和可變參數這三個概念,通過學習黑馬基礎入門視頻的C#編程基礎部分,以及查閱相關資料,對這三個知識點已經能夠基本掌握,還記得當初跳著看視頻,不能理解調用int.TryParse方法時,為什麼要在參數前加上out,out又有什麼作用,現在已經能清楚地運用它們了。即使這是些很簡單的內容,但是卻是很重要的基礎,我需要把它記錄下來,以便於提醒自己。現在發現,寫學習筆記不僅可以提高自己的表達能力,還有助於學習。
我告訴自己,需要堅持下去!
詳細請查看:www.itheima.com
引用參數以ref為關鍵字,這種參數是要在調用之前就初始化的。這參數一般情況下是從外部向內部傳遞數值的時候使用,對於托管代碼加ref和不加基本相同,但是對於托管代碼就有所區別。
輸出參數以out為關鍵字,這種參數不需要輸入確定的值,實際的對象是在方法內部初始化,由方法內部給這種參數賦值。一般是調用該方法之後,需要方法輸出一些數據的時候使用。因為有時候方法的返回值可能用作他用,而這時還想讓方法輸出其他的數據,就可以使用out參數了。
這個概念用在程序員自己編寫子程序中。
VB裡子程序分為:過程和函數;
以自定義一個可以計算兩數之和的函數為例:
說明:本函數需要兩個參數,這兩個參數就是你要它計算和的兩個加數,返回一個值,就是和。
在窗體上添加一個按鈕Command1
代碼如下:
Option Explicit
Private Sub Command1_Click()
Dim a As Single
Dim b As Single
a = 12.5
b = 20.8
Print MyAdd(a, b) '調用自定義函數
End Sub
Private Function MyAdd(ByVal x As Single, ByVal y As Single) As Single
MyAdd = x + y
End Function
這最後三行代碼就是一個自定義計算兩數之和的函數,其中;
MyAdd -- 函數名稱,函數具有類型,決定了返回值的類型
x,y ---- 就是2個參數,就是形式參數,可以看到參數需要定義類型
在調用自定義函數的語句 MyAdd(a, b)中,a,b就是實際參數;
在自定義函數中形式參數前用ByVal,說明該參數執行的數值傳遞執行調用,就是把實際參數的值傳遞給對應的形式參數;
而要特別注意幾點;
1,實際參數與形式參數個數相等;且一一對應,類型一致。
2,這個例子裡,a對應x,b對應y。
3,在自定義函數中形式參數前用ByVal,說明該參數執行的數值傳遞。(還有傳遞地址的,略)
4,對於數值傳遞的形式,實際參數可以是“表達式”。
例如;本例可以用下面的格式調用;
dim x as single
dim y as single
dim z as single
x = 2.3
y =3.14
z = MyAdd(x+y,x-y)
print z
這裡的x+y對應形式參數x,x-y對應形式參數x,
即將 2,3+3.14傳遞給x,2,3-3.14傳遞給y,結果是:4.6