1樓:匿名使用者
c# 語言規範
10.5.1.4 引數陣列
用 params 修飾符宣告的引數是引數陣列。如果形參表包含一個引數陣列,則該引數陣列必須位於該列表的最後而且它必須是一維陣列型別。例如,型別 string 和 string 可用作引數陣列的型別,但是型別 string[,] 不能。
不可能將 params 修飾符與 ref 和 out 修飾符組合起來使用。
在一個方法呼叫中,允許以下列兩種方式之一來為引數陣列指定對應的引數:
賦予引數陣列的引數可以是一個表示式,它的型別可以隱式轉換(第 6.1 節)為該引數陣列的型別。在此情況下,引數陣列的作用與值引數完全一樣。
或者,此呼叫可以為引數陣列指定零個或多個引數,其中每個引數都是一個表示式,它的型別可隱式轉換(第 6.1 節)為該引數陣列的元素的型別。在此情況下,此呼叫建立一個長度對應於引數個數、型別與該引數陣列的型別相同的一個陣列例項,並用給定的引數值初始化該陣列例項的元素,並將新建立的陣列例項用作實參。
除了允許在呼叫中使用可變數量的引數,引數陣列與同一型別的值引數(第 10.5.1.1 節)完全等效。
示例1.using system;2.class test3.
elements:", args.length);6.
foreach (int i in args) 7. console.write(" ", i);8.
console.writeline();9. }10.
static void main() ;12. f(arr);13. f(10, 20, 30, 40);14.
f();15. }16.}產生輸出
1.array contains 3 elements: 1 2 32.
array contains 4 elements: 10 20 30 403.array contains 0 elements:
f 的第一次呼叫只是將陣列 arr 作為值引數傳遞。f 的第二次呼叫自動建立一個具有給定元素值的四元素 int 並將該陣列例項作為值引數傳遞。與此類似,f 的第三次呼叫建立一個零元素的 int 並將該例項作為值引數傳遞。
第二次和第三次呼叫完全等效於編寫下列**:
1.f(new int );2.f(new int {});執行過載決策時,具有引數陣列的方法可能以它的正常形式或以它的擴充套件形式(第 7.
4.2.1 節)成為適用的。
只有在方法的正常形式不適用,並且在同一型別中尚未宣告與方法的擴充套件形式具有相同簽名的方法時,上述的方法擴充套件形式才可供選用。
示例1.using system;2.class test3.
7. static void f() 10. static void f(object a0, object a1) 13.
static void main() 20.}產生輸出
1.f();2.f(object);3.
f(object,object);4.f(object);5.f(object);在該示例中,在同一個類中,已經宣告瞭兩個常規方法,它們的簽名與具有引數陣列的那個方法的擴充套件形式相同。
因此,在執行過載決策時不考慮這些擴充套件形式,因而第一次和第三次方法呼叫將選擇常規方法。當在某個類中宣告瞭一個具有引數陣列的方法時,同時再宣告一些與該方法的擴充套件形式具有相同的簽名的常規方法,這種情況比較常見。這樣做可以避免為陣列配置記憶體空間(若呼叫具有引數陣列的方法的擴充套件形式,則無法避免)。
當引數陣列的型別為 object 時,在方法的正常形式和單個 object 引數的擴充套件形式之間將產生潛在的多義性。產生此多義性的原因是 object 本身可隱式轉換為 object。然而,此多義性並不會造成任何問題,這是因為可以在需要時通過插入一個強制轉換來解決它。
示例1.using system;2.class test3.
9. console.writeline();10.
}11. static void main() ;13. object o = a;14.
f(a);15. f((object)a);16. f(o);17.
f((object)o);18. }19.}產生輸出
1.system.int32 system.
string system.double2.system.
object3.system.object4.
system.int32 system.string system.
double在 f 的第一次和最後一次呼叫中,f 的正常形式是適用的,這是因為存在一個從自變數型別到引數型別的轉換(這裡,其實兩者都是 object 型別)。因此,過載決策選擇 f 的正常形式,而且將該引數作為常規的值引數傳遞。在第二次和第三次呼叫中,f 的正常形式不適用,這是因為不存在從自變數型別到引數型別的轉換(型別 object 不能隱式轉換為型別 object)。
但是,f 的擴充套件形式是適用的,因此過載決策選擇它。因此,這兩個呼叫都建立了一個具有單個元素的、型別為 object 的陣列,並且用給定的引數值(它本身是對一個 object 的引用)初始化該陣列的唯一元素。
參考資料
2樓:shine戚七七
1,函式引數是傳入函式的引數,如 求和函式 sum(int a,int b); a,b 就是引數
2,引數傳入的目的就是在函式中利用這些引數進行計算等。
3,比如有一個函式int sum(int a, int b)你呼叫sum 函式時就可以 int x = sum(5,3); 這樣 x 就 等於 8 了,就是把5,3這兩個實參傳到 形參a,b中
4, 在定義函式時,可以將函式的最後一個引數定義為引數陣列,引數陣列首先是一個陣列,其次,它又作為函式的最後一個引數,引數陣列只能是一維陣列
c#什麼是函式的引數陣列?
3樓:匿名使用者
引數陣列
就是函式呼叫中能使用可變數量的引數
示例using system;
class test
elements:", args.length);
foreach (int i in args)console.write(" ", i);
console.writeline();
}static void main() ;
f(arr);
f(10, 20, 30, 40);
f();}}
產生輸出
array contains 3 elements: 1 2 3array contains 4 elements: 10 20 30 40
array contains 0 elements:
f 的第一次呼叫只是將陣列 arr 作為值引數傳遞。f 的第二次呼叫自動建立一個具有給定元素值的四元素 int 並將該陣列例項作為值引數傳遞。與此類似,f 的第三次呼叫建立一個零元素的 int 並將該例項作為值引數傳遞。
c#陣列如何作為引數傳遞
4樓:匿名使用者
c#不可以,可以定義一個臨時陣列,將新陣列賦值傳遞
C語言,編寫函式,函式是用選擇排序法將陣列排序
px 10 改為 px a 編寫函式,使用選擇排序法對陣列進行排序 用c語言 include include include int main void if i tmp for i 0 i 10 i printf 3d a i printf n return 0 隨機產生陣列中的元素,更合理一些。...
關於c語言中陣列名作為引數傳遞的問題
陣列名作為引數就退化 為指標.所以在你的sizeofmat中,sizeof x 就值就是sizeof一個指標的值.因為指標就是地址,陣列名也是地址.所以你陣列名作為引數的時候,是不會傳遞整個陣列的,而是傳遞了一個地址,就是指標.sizeofmat的引數錯誤 必須是陣列型別 sizof x 才能將其視...
C在定義函式時,在傳遞的引數後面加上是什麼意思
沒有這個形式,寫反了,應該是 bool start char strr 這是說,函式的形參是你傳遞的實參的一個別名 引用 什麼叫別名呢?那就是一損俱損,一榮俱榮,完全可以當作同一個東西對待。說白了,函式裡對引用引數的改變會影響到呼叫這個函式的程式中實參的值。引用,也就是直接用該變數,不生成副本 沒有...