熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

.net程序員的盲點(一):ref,out ,params的區別

2013-11-13 09:55:52  來源: .NET編程 

  C#中有三個關鍵字refout params雖然本人不喜歡這三個關鍵字因為它們疑似破壞面向對象特性但是既然m$把融入在c#體系中那麼我們就來認識一下參數修飾符refout params吧還有它們的區別

  NO params

  一個可以讓方法(函數)的擁有可變參數的關鍵字

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

  示例(拷貝到vs中即可用下面不再說明)

  

  public partial class Form : Form
{
public static void UseParams(params int[] list)
{
string temp = ;
for (int i = ; i < listLength; i++)
temp = temp + +list[i]ToString();
MessageBoxShow(temp);
}

public static void UseParams(params object[] list)
{
string temp = ;
for (int i = ; i < listLength; i++)
temp = temp + + list[i]ToString();
MessageBoxShow(temp);
}

public Form()
{
InitializeComponent();
}

private void button_Click(object sender EventArgs e)
{
UseParams( ); //看參數是
UseParams( ); //看參數是可變吧


UseParams( a test);

int[] myarray = new int[] { };
UseParams(myarray); //看也可以是容器類可變吧
}
}

  NO out

  這是一個引用傳遞L

  原則一當一個方法(函數)在使用out作為參數時在方法中(函數)對out參數所做的任何更改都將反映在該變量中

  原則二當希望方法返回多個值時聲明 out 方法非常有用使用 out 參數的方法仍然可以返回一個值一個方法可以有一個以上的 out 參數

  原則三若要使用 out 參數必須將參數作為 out 參數顯式傳遞到方法out 參數的值不會傳遞到 out 參數

  原則四不必初始化作為 out 參數傳遞的變量因為out 參數在進入方法(函數)時後清空自己使自己變成一個干淨的參數也因為這個原因必須在方法返回之前為 out 參數賦值(只有地址沒有值的參數是不能被net接受的)

  原則五屬性不是變量不能作為 out 參數傳遞

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

  

  class MyClass
{
public void MyMethod(int i) {i = ; }
public void MyMethod(out int i) {i = ; }
}
而以下重載聲明是無效的
class MyClass
{
public void MyMethod(out int i) {i = ; }
public void MyMethod(ref int i) {i = ; }
}

  有關傳遞數組的信息請參見使用 ref 和 out 傳遞數組

  NO ref

  ref僅僅是一個地址!!!

  原則一當一個方法(函數)在使用ref作為參數時在方法中(函數)對ref參數所做的任何更改都將反映在該變量中

  原則二調用方法時在方法中對參數所做的任何更改都將反映在該變量中

  原則三若要使用 ref 參數必須將參數作為 ref 參數顯式傳遞到方法ref 參數的值可以被傳遞到 ref 參數

  原則四ref參數傳遞的變量必須初始化因為ref參數在進入方法(函數)時後還是它自己它這個地址指向的還是原來的值也因為這個原因ref參數也可以在使用它的方法內部不操作

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

  

  class MyClass
{
public void MyMethod(int i) {i = ; }
public void MyMethod(ref int i) {i = ; }
}
但以下重載聲明是無效的
class MyClass
{
public void MyMethod(out int i) {i = ; }
public void MyMethod(ref int i) {i = ; }
}

  有關傳遞數組的信息請參見使用 ref 和 out 傳遞數組

  示例

  

  public static string TestOut(out string i)
{
i = out b;
return return value;
}


public static void TestRef(ref string i)
{
//改變參數
i = ref b;
}

public static void TestNoRef(string refi)
{
// 不用改變任何東西這個太明顯了
refi = on c;
}

public Form()
{
InitializeComponent();
}

private void button_Click(object sender EventArgs e)
{
string outi; //不需要初始化
MessageBoxShow(TestOut(out outi)); //返回值
//輸出return value;
MessageBoxShow(outi); //調用後的out參數
//輸出out b;


string refi = a; // 必須初始化
TestRef(ref refi); // 調用參數
MessageBoxShow(refi);
//輸出ref b;
TestNoRef(refi); //不使用ref
MessageBoxShow(refi);
//輸出ref b;
}


From:http://tw.wingwit.com/Article/program/net/201311/12015.html
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.