C# 參數傳遞心得

C# 參數傳遞模式預設為「傳值」,也就是程序甲呼叫程序乙,並傳參數A給時,參數A是以一個副本的概念傳遞。
所以對於實值型別(如整數、字元、結構等)而言,A傳遞到乙的時候,是以一個跟A有相同的內容實值的另一個變數過去,也就是在甲中的A與乙的A是兩個具有相同內容、但儲存在記憶體不同位址的變數。
對於參考型別(如字串、類別)而言,是複製一個指向位於heap中相同位址的變數,所以甲和乙各有一個變數(即A)指向一個相同的內容值(A所參考指向的物件)。
因此,假設在乙的過程中更改A的內容值,自乙離開後回到甲後,查看A的內容結果:對實值型別來說,A並沒有改變,也就是乙裡面做的改變並未影響甲的A;對參考型別來說,只要沒有更動A變數的參考(後述),則A是改變過的。
Ex:

整數參數

void 甲()
{
int A=1;
// 查看A會等於 1
乙(A);
// 查看A會等於2
}
void 乙(int A) { A=A+1; }

物件參數

class C1
{
string str1;
public C1()
{ }
public string Str1
{ get{ return str1;} set { str1 = value; } }
}
void 甲() {
C1 A = new C1();
A.Str1 = "ABC";
// 查看A的屬性St1會等於 ABC
乙(A);
// 查看A的屬性St1會等於 ABCchanged
}
void 乙(C1 A) { C1.Str1 = C1.Str1 +"changed"; }

字串參數

void 甲() {
string A="ABC";
// 查看A會等於 ABC
乙(A);
// 查看A會等於ABCchanged
}
void 乙(string A) { A=A+"changed"; }


至於更動參考型別的變數參考,是指在乙重新指派新的值給他,一般都是透過 new 關鍵字,此時候在乙中對A嘗試修改都不會影響甲的A(如上述的字串參數)。

當甲的A有需要允許在乙中被更動時,可以透過「參數傳遞模式(parameter passing mode)關鍵字來將乙的A變更帶回甲中。
關鍵字有:
  1. "out":限定參數一定要在乙的過程中初始化(暗指在甲中的初始化是不必需,且最後必須被覆蓋的)。
  2. "ref":限定參數一定要在傳入乙之前被初始化(暗示乙中可以不設定或異動A)。
這兩個參數在方法的定義還有使用上,都必須明確的使用上這些關鍵字,即function的參數前有帶關鍵字,呼叫時也一定要帶上。(隱含可以允許在關鍵字上差異的多載

留言

這個網誌中的熱門文章

Excel技巧(1):檔案肥大的原因,附上減肥撇步

Excel技巧(2):拜託殺了那些看不見的空白吧!

Excel版本與檔案格式