C# 參數(shù)

2018-01-16 01:54 更新

C#參數(shù)

方法可以具有參數(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)ValueGoing in
refReferenceGoing in
outReferenceGoing out

按值傳遞參數(shù)

默認(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。


ref修飾符

為了通過(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修飾符

out參數(shù)就像一個(gè) ref 參數(shù),除了它:

  • 在進(jìn)入函數(shù)之前不需要賦值
  • 必須在它出來(lái)的函數(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修飾符

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 } ); 

可選參數(shù)

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ù)組合。

命名參數(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); 
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)