//params關鍵字使用
class Program { static void Main(string[] args){ int[] arr = { 10, 20, 30,60 }; Console.WriteLine(AddFunction(arr)); Console.WriteLine(AddFunction(10,20,30,60)); Console.ReadKey(); } static int AddFunction(params int[] values ) { int temp = 0; foreach (var item in values) { temp += item; } return temp; }
實現了一個AddFunction方法,用於接收一組整數,並返回它們的和。參數values被加上params關鍵字后,在調用時可以在實參列表中列舉出這組整數中的每個元素,非常方便。
關於params關鍵字的用法,需要注意以下幾點:
1. params只能用於一維數組,不能用於多維數組和諸如ArrayList、List<T>等任何類似於數組的集合類型。
2. 被加上params關鍵字的形參,必須是形參列表中最后一個形參,並且方法聲明中只允許一個 params 關鍵字。
3. 用params關鍵字的方法,有三種調用形式:
第一種,列舉出數組各元素:AddFunction(1,2,3),這也是最常用的形式;
第二種,像沒有加params關鍵字的數組形參那樣,用數組名做實參:AddFunction(new int[]{1,2,3})或int n=new int[]{1,2,3};AddFunction(n);;
第三種,加params關鍵字的參數在調用時可以省略:AddFunction();//返回0;這種方式有時可以少定義一個方法重載,但當明確定義了重載int AddFunction()時,編譯器會優先調用int AddFunction(),而不是AddFunction(params int[] values)。而且省略params型參數,方法內部仍會new一個元素個數為0的數組,效率略查。
第四種,不省略params型參數,用null代替,效率比第三種略高,因為其內部不會new這個數組。
ref關鍵字使用
static void Main(string[] args){ string ss = "1-425-42-4-2-5"; change(ref ss); Console.WriteLine(ss); Console.ReadKey(); } static void change(ref string value) { string[] strArray = value.Split('-'); value = String.Join("+",strArray); }
out關鍵字的使用(經過試驗:out,ref可以混用(在注意語法的前提下))
static void Main(string[] args){ int[] arr = { 50,56,23,45656,146,2353566,1633,22}; int indexOut = 0;//ref:要初始化,out:不用初始化 Console.WriteLine("最大值{0},索引是{1}",MaxNumber(arr,ref/*out*/ indexOut),indexOut); Console.ReadKey(); } static int MaxNumber(int[]values ,ref/*out*/ int index) { int max = values[0]; index = 0; for (int i = 0; i < values.Length; i++) { if (max < values[i]) { max = values[i]; index = i; } } return max; }
二者區別與聯系
首先:兩者都是按地址傳遞的,使用后都將改變原來參數的數值。
其次:ref可以把參數的數值傳遞進函數,但是out是要把參數清空,就是說你無法把一個數值從out傳遞進去的,out進去后,參數的數值為空,所以你必須初始化一次。這個就是兩個的區別,ref是有進有出,out是只出不進。
ref 關鍵字使參數按引用傳遞。其效果是,當控制權傳遞回調用方法時,在方法中對參數的任何更改都將反映在該變量中。若要使用 ref 參數,則方法定義和調用方法都必須顯式使用 ref 關鍵字。
傳遞到 ref 參數的參數必須最先初始化。這與 out 不同,后者的參數在傳遞之前不需要顯式初始化。
out 關鍵字會導致參數通過引用來傳遞。這與 ref 關鍵字類似,不同之處在於 ref 要求變量必須在傳遞之前進行初始化。若要使用 out 參數,方法定義和調用方法都必須顯式使用 out 關鍵字。
靜態方法與實例方法
靜態方法只能訪問類中的靜態成員,實例方法可以訪問類中的任何成員
虛方法(virtual) 重寫虛方法(override) 不允許重寫(sealed)外部方法(DllImport)