一般的方法可以寫多過載的方法來適應不同的引數。
如果實在覺得有很多不確定個數的引數可能會用時,那麼可以用乙個陣列來存放這些引數(相同資料型別的引數)。
當然如果是不同型別的引數的話,你可以建立乙個struct結構的結構陣列在存放不同引數, 只是會影響效能。
以下**msdn
用params修飾符宣告的引數是引數陣列。如果形參表包含乙個引數陣列,則該引數陣列必須位於該列表的最後而且它必須是一維陣列型別。例如,型別 string 和 string 可用作引數陣列的型別,但是型別 string[,] 不能。不可能將 params 修飾符與 ref 和 out 修飾符組合起來使用。
在乙個方法呼叫中,允許以下列兩種方式之一來為引數陣列指定對應的引數:
賦予引數陣列的引數可以是乙個表示式,它的型別可以隱式轉換(第 6.1 節)為該引數陣列的型別。在此情況下,引數陣列的作用與值引數完全一樣。
或者,此呼叫可以為引數陣列指定零個或多個引數,其中每個引數都是乙個表示式,它的型別可隱式轉換(第 6.1 節)為該引數陣列的元素的型別。在此情況下,此呼叫建立乙個長度對應於引數個數、型別與該引數陣列的型別相同的乙個陣列例項,並用給定的引數值初始化該陣列例項的元素,並將新建立的陣列例項用作實參。
除了允許在呼叫中使用可變數量的引數,引數陣列與同一型別的值引數(第 10.5.1.1 節)完全等效。
示例
using system;
class test
elements:", args.length);
foreach (int i in args)
console.write(" ", i);
console.writeline();
}
static void main() ;
f(arr); 該陣列例項作為值引數傳遞,等價於 f(new int );
f(10, 20, 30, 40);
f(); 等價於f(new int {});
}
}
產生輸出
array contains 3 elements: 1 2 3
array contains 4 elements: 10 20 30 40
array contains 0 elements:
f 的第一次呼叫只是將陣列 arr 作為值引數傳遞。f 的第二次呼叫自動建立乙個具有給定元素值的四元素 int 並將該陣列例項作為值引數傳遞。與此類似,f 的第三次呼叫建立乙個零元素的 int 並將該例項作為值引數傳遞。第二次和第三次呼叫完全等效於編寫下列**:
f(new int );
f(new int {});
執行過載決策時,具有引數陣列的方法可能以它的正常形式或以它的擴充套件形式(第 7.4.2.1 節)成為適用的。只有在方法的正常形式不適用,並且在同一型別中尚未宣告與方法的擴充套件形式具有相同簽名的方法時,上述的方法擴充套件形式才可供選用。
示例
using system;
class test
static void f()
static void f(object a0, object a1)
static void main()
}
產生輸出
f();
f(object);
f(object,object);
f(object);
f(object);
*優先呼叫引數個數相對應方法。
在該示例中,在同乙個類中,已經宣告了兩個常規方法,它們的簽名與具有引數陣列的那個方法的擴充套件形式相同。因此,在執行過載決策時不考慮這些擴充套件形式,因而第一次和第三次方法呼叫將選擇常規方法。當在某個類中宣告了乙個具有引數陣列的方法時,同時再宣告一些與該方法的擴充套件形式具有相同的簽名的常規方法,這種情況比較常見。這樣做可以避免為陣列配置記憶體空間(若呼叫具有引數陣列的方法的擴充套件形式,則無法避免)。
當引數陣列的型別為 object 時,在方法的正常形式和單個 object 引數的擴充套件形式之間將產生潛在的多義性。產生此多義性的原因是 object 本身可隱式轉換為 object。然而,此多義性並不會造成任何問題,這是因為可以在需要時通過插入乙個強制轉換來解決它。
示例
using system;
class test
console.writeline();
}
static void main() ;
object o = a;
f(a);
f((object)a); 強制轉換為object型別,而非object型別
f(o); o為object型別,而非object型別
f((object)o); 強制轉換為object型別,而非object型別
}
}
產生輸出
system.int32 system.string system.double
system.object
system.object
system.int32 system.string system.double
在 f 的第一次和最後一次呼叫中,f 的正常形式是適用的,這是因為存在乙個從自變數型別到引數型別的轉換(這裡,其實兩者都是 object 型別)。因此,過載決策選擇 f 的正常形式,而且將該引數作為常規的值引數傳遞。在第二次和第三次呼叫中,f 的正常形式不適用,這是因為不存在從自變數型別到引數型別的轉換(型別 object 不能隱式轉換為型別 object)。但是,f 的擴充套件形式是適用的,因此過載決策選擇它。因此,這兩個呼叫都建立了乙個具有單個元素的、型別為 object 的陣列,並且用給定的引數值(它本身是對乙個 object 的引用)初始化該陣列的唯一元素。
c#中params的使用詳解
**自:
為了將方法宣告為可以接受可變數量引數的方法,我們可以使用params關鍵字來宣告陣列,如下所示:
public static int32add(params int32 values)
return sum;
}只有方法的最後乙個引數才可以標記params,該引數必須標識乙個一維陣列,但型別不限。對方法的最後乙個引數傳遞null或者0個數目的陣列的引用都是合法的,如下面**呼叫上面add方法,編譯正常,執行正常,和期望一樣結果為0:
public static void main()
下面看一下如何編寫乙個可以接受任意數量、任意型別的引數的方法,也就是把上面方法的int32改成object就可以了:
public static void main()
public static void displaytypes(params object objects)
}輸出:
system.object
system.random
system.string
system.int32
注意,對於可接受可變數量引數的方法的呼叫會對效能造成一定的損失,因為陣列是在堆上分配的,陣列的元素還得初始化,陣列的記憶體還得被垃圾**器**,為了減少這種沒必要的效能損失,我們希望定義幾個沒有params關鍵字的過載方法,如system.string類的concat方法,如下:
public static string concat(object arg0);
public static string concat(params object args);
public static string concat(params string values);
public static string concat(object arg0, object arg1);
public static string concat(string str0, string str1);
public static string concat(object arg0, object arg1, object arg2);
public static string concat(string str0, string str1, string str2);
public static string concat(object arg0, object arg1, object arg2, object arg3);
public static string concat(string str0, string str1, string str2, string str3);
C 方法引數 params
1.上測試 using system using system.collections.generic using system.text using system.threading namespace leaf console.writeline nb.傳2個引數 testmethod 1,2 ...
Params 方法引數
在下面的方法使用中 openwindow params object args 傳遞的引數args新增了params修飾 public void openwindow params object args public void init 使用params關鍵字可以指定採用數目可變的引數的方法引數,...
C 可變引數params的使用
之前一直忘記這個params,特此記錄一下。可變引數可在不確定引數個數的情況下使用。需要放到最後乙個且只能有乙個。傳入的陣列可以是任意型別的,定義為object即可。實現 private void data params object data 如果params string data 只能傳參st...