1. 值參數
通過將實參的值複製到形參的方式把數據傳遞給方法,在棧中爲形參分配空間。
- 值類型參數會被複制,產生一個獨立的數據項;
- 引用類型會複製引用,實參和形參都引用堆中同一個對象;
- 引用類型值參數,如果在方法內創建一個新對象並賦值給形參,將切斷形參與實參的聯繫,在方法結束後,新對象也將不存在,實參仍指向原始對象。
2. 引用參數(ref)
方法的聲明和調用中都要用ref修飾,實參必須是變量,傳參前必須被賦值。
不會新分配內存,形參實參都指向相同的內存,方法內對參數的改變在方法外依然有效。
- 引用類型引用參數,修改會同時影響實參和形參,如果在方法內創建一個新對象並賦值給形參,形參和實參的引用都指向新對象,在方法結束後,新對象依然存在,並且是實參所引用的值,實參指向方法內創建的新對象。
3. 輸出參數(out)
方法的聲明和調用中都要用out修飾,實參必須是變量,傳參前可以不賦值,方法內必須進行賦值。
不會新分配內存,形參實參都指向相同的內存,方法內對參數的改變在方法外依然有效。(與ref類似)
4. 數組參數(params)
在聲明中數據類型前使用params修飾,可以有0個或多個實參對應一個特殊的形參(看起來像是一個數組)。
- 方法的參數列表中只能有一個參數數組,且必須在列表的最後一個;
- 參數數組的所有參數必須是相同類型;
- 方法調用時不需要params修飾符,使用逗號分隔參數;
- 參數數組如果是引用參數或輸出參數,聲明和調用都需要加修飾符;
- 如果數組參數是值類型,形參改變不會影響實參;
- 如果數組參數是引用類型,形參改變會影響實參。
private void Start()
{
TestFunc("name", 1, 2, 3);
}
private void TestFunc(string name, params int[] value)
{
//*****
}
5. 命名參數
普通情況用到的參數是未知參數,實參的位置必須與相應的形參位置對應。
命名參數,只要顯示指定參數的名字,可以以任意順序在方法中調用實參。
private void Start()
{
TestFunc(value: 2.0f, key: 1, name: "name");
}
private void TestFunc(string name, int key, float value)
{
//*****
}
6. 可選參數
可選參數是在方法聲明中提供默認值,在調用方法的時候可以賦值,也可以忽略。
- 只要值類型的默認值在編譯的時候確定,就可以作爲可選參數;
- 只有引用類型的默認值爲null的時候,才能作爲可選參數;
- 所有的可選參數必須在必選參數之後;
- 如果有params數組參數,必須在可選參數之後;
- 多個可選參數在省略賦值時,必須從後往前省略。
private void Start()
{
TestFunc("name");
TestFunc("name", 1);
TestFunc("name", 1, 2.0f);
TestFunc("name", value: 2.0f);
TestFunc("name", 1, 2.0f, true);
TestFunc("name", value: 2.0f, other: true);
}
private void TestFunc(string name, int key = 1, float value = 2.0f, params bool[] other)
{
//*****
}