【C#】【溫故知新】函數/方法參數基礎

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)
    {
        //*****
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章