C# - 方法參數

這篇主要介紹的是在Method中常用到的幾個修飾詞,params, ref, out:


params

params讓使用者在傳入Array引數時能夠以多個單一型態的參數代替以Array方式傳入,增加程式的易讀性,使用params時有幾個限制條件:
1. 一個Method只能使用一次params
2. params必須加在Method的參數宣告列裡
3. params只能夠加在參數宣告列中最後的Array Type 參數前(意思為宣告params的參數後面不能有其他參數)
4. params只能加在Array Type的參數



使用params的Method宣告如下:
static void TestArrayArgs(String[] arry1, params Int32[] arry2)
    {
        (new List(arry1)).ForEach(m => Console.WriteLine(m));
        (new List(arry2)).ForEach(m => Console.WriteLine(m));
    }

呼叫的方式如下:
TestArrayArgs(new String[]{ "1", "2", "3" }, 1, 2, 3);


ref

一般程式語言中常常會在Call By Value與Call By Reference之間搞混,兩者之間的差異我們在此就不多作解釋,在進行Call By Reference的操作時,就會使用到ref與out。ref如同C++中的&傳送記憶體位置一樣,傳入的變數在經過運算後,因為其記憶體位置的改變,在跳出Method返回後,他的值也會跟著改變,通常這用於一個Method想回傳多個運算結果的情況,ref在使用時有幾個限制:
1. 傳進ref參數的引數必須要在傳入前設定初始值
2. 在Method宣告列中,使用ref的參數前須加上ref修飾詞
3. 在呼叫該方法時,ref參數的引數前要加上ref修飾詞
以下為使用ref的範例程式碼:
using System;

namespace MyTest
{
    class Program
    {
        static void Main(String[] args)
        {
            int x = 1;
            int y = 2;
            ChangeValue(ref x, ref y);
            Console.WriteLine("x = {0}, y = {1}", x, y);
            Console.ReadLine();
        }

        static void ChangeValue(ref int a, ref int b)
        {
            a = 100;
            b = -100;
        }
    }
}

輸出:





out

out與ref使用用法相同,差別在於傳進out參數的引數不需要再傳入前初始化,而是在Method中初始化,如果在Method中沒有初始化則會出錯,如下圖。






以下為使用out的範例程式碼,與ref結果相同:
using System;

namespace MyTest
{
    class Program
    {
        static void Main(String[] args)
        {
            int x;
            int y;
            ChangeValue(out x, out y);
            Console.WriteLine("x = {0}, y = {1}", x, y);

            Console.ReadLine();
        }

        static void ChangeValue(out int a, out int b)
        {
            a = 100;
            b = -100;
        }
    }
}


這邊有幾點要特別注意的是:
1. 在建立同一個Method的Overload時,out和ref會被視為相同,故無法使用Overload:






參考來源:
MSDN params (C# 參考)
MSDN out (C# 參考)
MSDN ref (C# 參考)

留言