ref和out都對函數參數采用引用傳遞形式——不管是值類型參數還是引用類型參數,並且定義函數和調用函數時都必須顯示生命該參數為
ref/out形式。兩者都可以使函數傳回多個結果。
ref 類似於 PHP 中在函數參數前的 &
兩者區別:
兩種參數類型的設計思想不同,ref的目的在於將值類型參數當作引用型參數傳遞到函數,是函數的輸入參數,並且在函數內部的任何改變也
都將影響函數外部該參數的值;而out的目的在於獲取函數的返回值,是輸出參數,由函數內部計算得到的值再回傳到函數外部,因此必須在
函數內部對該參數賦值,這將沖掉函數外部的任何賦值,使得函數外部賦值毫無意義。
表現為:
1、out必須在函數體內初始化,這使得在外面初始化變得沒意義。也就是說,out型的參數在函數體內不能得到外面傳進來的初始值。
2、ref必須在函數體外初始化。
3、兩者在函數體內的任何修改都將影響到函數體外面。
語法:
namespace ConsoleApplication1 { class Program { static void Main(string[] args) { int n1 = 10; Incr(ref n1); Console.WriteLine(n1); Decr(out n1); Console.WriteLine(n1); Console.ReadKey(); } public static void Incr(ref int n1) { n1++; } public static void Decr(out int n1) { n1 = 1; n1--; } } }
params 關鍵字可以指定在參數數目可變處采用參數的方法參數,類似於JS 中的 arguments (JS中arguments無需指定,函數內可直接使用)(PHP中 func_get_arg() 或者使用擴展運算符...$args 用一個變量已數組的形式接收所有參數)
在方法聲明中的 params 關鍵字之后不允許任何其他參數,並且在方法聲明中只允許一個 params 關鍵字)
參數類型必須保持一致
class Program { static void Main(string[] args) { fn("hello", "word"); Console.ReadKey(); } public static void fn(params string[] list) { foreach (string str in list) { Console.WriteLine(str); } } }