.net中 參數out,ref,params的區別

來源:互聯網
上載者:User

先總的來說:

       通常我們向方法中傳遞的是值.方法獲得的是這些值的一個拷貝,然後使用這些拷貝,當方法運行完畢後,這些拷貝將被丟棄,而原來的值不將受到影響.此外我們還有其他向方法傳遞參數的形式,引用(ref)和輸出(out).

       有時,我們需要改變原來變數中的值,這時,我們可以向方法傳遞變數的引用,而不是變數的值.引用是一個變數,他可以訪問原來變數的值,修改引用將修改原來變數的值.變數的值儲存在記憶體中,可以建立一個引用,他指向變數在記憶體中的位置.當引用被修改時,修改的是記憶體中的值,因此變數的值可以將被修改.當我們調用一個含有引用參數的方法時,方法中的參數將指向被傳遞給方法的相應變數,因此,我們會明白,為什麼當修改參數變數的修改也將導致原來變數的值.

       Ref指明了方法中使用的是引用型參數,引用型參數不開闢新的記憶體地區。當利用引用型參數向方法傳遞形參時,編譯器將把實際值在記憶體中的地址傳遞該方法。引用型參數通常已經初始化。   
  如   
  int   i=1,j=2;//初始化   
  Swap(ref   i,ref   j);   
    
   Out輸出型參數也不開闢新的記憶體地區,但與引用型參數不同的是,調用方法之前無需對變數進行初始化,輸出型參數主要用於傳遞方法返回的資料。   
  string   name,path;//沒有初始化   
  File(out   name,out   path);

 

首先先說ref:(MSDN)

C# 關鍵字 | 方法參數

       方法參數上的 ref 方法參數關鍵字使方法引用傳遞到方法的同一個變數。當控制傳遞迴調用方法時,在方法中對參數所做的任何更改都將反映在該變數中。若要使用 ref 參數,必須將參數作為 ref 參數顯式傳遞到方法。ref 參數的值被傳遞到 ref 參數。傳遞到 ref 參數的參數必須最先初始化。將此方法與 out 參數相比,後者的參數在傳遞到 out 參數之前不必顯式初始化。

 

屬性不是變數,不能作為 ref 和out參數傳遞。

 

如果兩種方法的聲明僅在它們對 ref 的使用方面不同,則將出現重載。但是,無法定義僅在 ref 和 out 方面不同的重載。例如,以下重載聲明是有效:

 

class MyClass 

{

public void MyMethod(int i) {i = 10;}

public void MyMethod(ref int i) {i = 10;}

}

但以下重載聲明是無效的:

class MyClass 

{

public void MyMethod(out int i) {i = 10;}

public void MyMethod(ref int i) {i = 10;}

}

 

樣本:

代碼

using System;

public class MyClass 

{

public static void TestRef(ref char i) 

{

// The value of i will be changed in the calling method

i = 'b';

}

 

public static void TestNoRef(char i) 

{

// The value of i will be unchanged in the calling method

i = 'c';

}

 

public static void Main() 

{

char i = 'a'; // variable must be initialized

TestRef(ref i); // the arg must be passed as ref

Console.WriteLine(i);

TestNoRef(i);

Console.WriteLine(i);

}

}

 

輸出

b

b

 

這裡為你說out:

C# 關鍵字 | 方法參數

       方法參數上的 out 方法參數關鍵字使方法引用傳遞到方法的同一個變數。當控制傳遞迴調用方法時,在方法中對參數所做的任何更改都將反映在該變數中。當希望方法返回多個值時,聲明 out 方法非常有用。使用 out 參數的方法仍然可以返回一個值。一個方法可以有一個以上的 out 參數。若要使用 out 參數,必須將參數作為 out 參數顯式傳遞到方法。out 參數的值不會傳遞到 out 參數。不必初始化作為 out 參數傳遞的變數。然而,必須在方法返回之前為 out 參數賦值。

 

       如果兩個方法的聲明僅在 out 的使用方面不同,則會發生重載。不過,無法定義僅在 ref 和 out 方面不同的重載。例如,以下重載聲明是有效:

 

class MyClass 

{

public void MyMethod(int i) {i = 10;}

public void MyMethod(out int i) {i = 10;}

}

而以下重載聲明是無效的:

 

class MyClass 

{

public void MyMethod(out int i) {i = 10;}

public void MyMethod(ref int i) {i = 10;}

}

 

樣本:

代碼

using System;

public class MyClass 

{

public static int TestOut(out char i) 

{

i = 'b';

return -1;

}

 

public static void Main() 

{

char i; // variable need not be initialized

Console.WriteLine(TestOut(out i));

Console.WriteLine(i);

}

}

 

輸出

-1

B

 

params 關鍵字可以指定在參數數目可變處採用參數的方法參數。 

在方法聲明中的 params 關鍵字之後不允許任何其他參數,並且在方法聲明中只允許一個 params 關鍵字。 

樣本:

代碼

using System; 
public class MyClass 
{ 
public static void UseParams(params int[] list) 
{ 
for ( int i = 0 ; i < list.Length ; i++ ) 
Console.WriteLine(list[i]); 
Console.WriteLine(); 
} 

public static void UseParams2(params object[] list) 
{ 
for ( int i = 0 ; i < list.Length ; i++ ) 
Console.WriteLine(list[i]); 
Console.WriteLine(); 
} 

public static void Main() 
{ 
UseParams(1, 2, 3); 
UseParams2(1, 'a', "test"); 

int[] myarray = new int[3] {10,11,12}; 
UseParams(myarray); 
} 
} 

 

輸出 
1 
2 
3 

1 
a 
test 

10 
11 
12

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.