W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
方法可以具有參數(shù)序列。
參數(shù)定義必須為該方法提供的參數(shù)集。
在以下示例中,myMethod
方法具有名為p
的單個(gè)參數(shù),類型為int
:
static void myMethod (int p) {
p = p + 1; // Increment p by 1
Console.WriteLine(p); // Write p to screen
}
static void Main() {
myMethod (8);
}
我們可以控制參數(shù)如何通過(guò) ref
和 out
修飾符傳遞。
下表列出了 ref
和 out
修飾符的功能。
修飾符 | 項(xiàng)目 | 變量必須明確賦值 |
---|---|---|
(None) | Value | Going in |
ref | Reference | Going in |
out | Reference | Going out |
默認(rèn)情況下,C#中的參數(shù)通過(guò)值傳遞。按值傳遞意味著在傳遞給方法時(shí)將創(chuàng)建值的副本:
class Main {
static void myMethod (int p) {
p = p + 1; // Increment p by 1
Console.WriteLine (p); // Write p to screen
}
static void Main() {
int x = 8;
myMethod (x); // Make a copy of x
Console.WriteLine (x); // x will still be 8
}
}
賦值 p
新值不會(huì)更改 x
的內(nèi)容。
按值傳遞引用類型參數(shù)會(huì)復(fù)制引用,而不是對(duì)象。
在下面的示例中, myMethod
看到與 Main
實(shí)例化相同的StringBuilder
對(duì)象,但具有對(duì)它的獨(dú)立引用。
sb
和 myMethodSB
是引用同一個(gè)StringBuilder
對(duì)象的兩個(gè)不同的變量:
class Main {
static void myMethod (StringBuilder myMethodSB) {
myMethodSB.Append ("test");
myMethodSB = null;
}
static void Main() {
StringBuilder sb = new StringBuilder();
myMethod (sb);
Console.WriteLine (sb.ToString()); // test
}
}
myMethodSB
是引用的副本,將其設(shè)置為 null
不會(huì)使sb為null。
為了通過(guò)引用,C#提供ref
參數(shù)修飾符。
在以下示例中,p
和 x
指的是相同的存儲(chǔ)器位置:
class Test {
static void myMethod (ref int p) {
p = p + 1; // Increment p by 1
Console.WriteLine (p); // Write p to screen
}
static void Main(){
int x = 8;
myMethod (ref x); // Ask myMethod to deal directly with x
Console.WriteLine (x); // x is now 9
}
}
賦值 p
一個(gè)新值將更改 x
。
在編寫(xiě)和調(diào)用方法時(shí)都需要ref
修飾符。
以下代碼顯示如何使用 ref
修飾符創(chuàng)建交換方法:
class Test {
static void Swap (ref string a, ref string b){
string temp = a;
a = b;
b = temp;
}
static void Main() {
string x = "A";
string y = "B";
Swap (ref x, ref y);
Console.WriteLine (x);
Console.WriteLine (y);
}
}
參數(shù)可以通過(guò)引用或按值傳遞,而不管參數(shù)類型是引用類型還是值類型。
out參數(shù)就像一個(gè) ref
參數(shù),除了它:
out
修飾符用于從方法獲取多個(gè)返回值。
例如:
class Test {
static void ToWords (string name, out string firstNames, out string lastName) {
int i = name.LastIndexOf (" ");
firstNames = name.Substring (0, i);
lastName = name.Substring (i + 1);
}
static void Main(){
string a, b;
ToWords("this is a test", out a, out b);
Console.WriteLine (a);
Console.WriteLine (b);
}
}
像 ref
參數(shù)一樣,out
參數(shù)通過(guò)引用傳遞。
params
參數(shù)修飾符用于方法的最后一個(gè)參數(shù),以便該方法接受任意數(shù)量的特定類型的參數(shù)。
參數(shù)類型必須聲明為數(shù)組。
例如:
class Test {
static int Sum (params int[] ints) {
int sum = 0;
for (int i = 0; i < ints.Length; i++) {
sum += ints[i]; // Increase sum by ints[i]
}
return sum;
}
static void Main(){
int total = Sum (1, 2, 3, 4);
Console.WriteLine (total); // 10
}
}
我們還可以提供一個(gè) params
參數(shù)作為普通數(shù)組。
int total = Sum (new int[] { 1, 2, 3, 4 } );
C#方法,構(gòu)造函數(shù)和索引器可以聲明可選參數(shù)。
如果參數(shù)在其聲明中指定了默認(rèn)值,那么該參數(shù)是可選的:
void myMethod (int x = 23) {
Console.WriteLine (x);
}
調(diào)用方法時(shí)可以省略可選參數(shù):
myMethod(); // 23
默認(rèn)參數(shù)23實(shí)際上傳遞給可選參數(shù)x
。
前面對(duì)myMethod的調(diào)用在語(yǔ)義上與:
myMethod (23);
可選參數(shù)不能用 ref
或 out
標(biāo)記。
可選參數(shù)的默認(rèn)值必須是常量表達(dá)式,或值類型的參數(shù)較少的構(gòu)造函數(shù)。
強(qiáng)制參數(shù)必須在方法聲明和方法調(diào)用中的可選參數(shù)之前發(fā)生。
在以下示例中,顯式值1傳遞給 x
,默認(rèn)值0傳遞給 y
:
void myMethod (int x = 0, int y = 0) {
Console.WriteLine (x + ", " + y);
}
void Test() {
myMethod(1); // 1, 0
}
要將默認(rèn)值傳遞給 x
和顯式值為 y
,我們必須將可選參數(shù)與命名參數(shù)組合。
我們可以通過(guò)名稱識(shí)別參數(shù)。例如:
void myMethod (int x, int y) {
Console.WriteLine (x + ", " + y);
}
void Test() {
myMethod (x:1, y:2); // 1, 2
}
命名參數(shù)可以以任何順序發(fā)生。
以下對(duì)myMethod的調(diào)用在語(yǔ)義上是相同的:
myMethod (x:1, y:2);
myMethod (y:2, x:1);
我們可以混合命名和位置參數(shù):
myMethod (1, y:2);
位置參數(shù)必須在命名參數(shù)之前。
所以我們不能這樣調(diào)用 myMethod
:
myMethod (x:1, 2); // Compile-time error
命名參數(shù)對(duì)可選參數(shù)很有用。
例如,考慮以下方法:
void myMethod (int a = 0, int b = 0, int c = 0, int d = 0) { ... }
我們可以調(diào)用這個(gè)方法只為 d
提供一個(gè)值,如下所示:
myMethod (d:3);
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: