首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# 參數傳遞機制:值傳遞、ref 與 out 詳細解析

     編輯:關於C#

值參數與參考參數的核心差異

預設情況下,C# 方法參數為值傳遞:呼叫時將實際值複製給形式參數,方法內修改不影響原變數。若需在方法內修改呼叫端的變數,需使用 ref 或 out 關鍵字進行參考傳遞。

值傳遞範例

static void DoDouble(double myNum)
{
    myNum *= 2;
    Console.WriteLine("方法內 myNum = {0}", myNum);
}

static void Main()
{
    double myNum = 15;
    Console.WriteLine("呼叫前 myNum = {0}", myNum); // 15
    DoDouble(myNum);
    Console.WriteLine("呼叫後 myNum = {0}", myNum); // 仍為 15,未改變
}

值傳遞執行結果

透過回傳值修改原變數

static double DoDouble(double myNum)
{
    myNum *= 2;
    Console.WriteLine("方法內 myNum = {0}", myNum);
    return myNum;
}

static void Main()
{
    double myNum = 15;
    Console.WriteLine("呼叫前 myNum = {0}", myNum);
    myNum = DoDouble(myNum); // 接收回傳值
    Console.WriteLine("呼叫後 myNum = {0}", myNum); // 變為 30
}

回傳值修改結果

但此法無法同時修改多個參數。

使用 ref 關鍵字實現參考傳遞

static void DoDouble(ref double myNum)
{
    myNum *= 2;
    Console.WriteLine("方法內 myNum = {0}", myNum);
}

static void Main()
{
    double myNum = 15;
    Console.WriteLine("呼叫前 myNum = {0}", myNum);
    DoDouble(ref myNum); // 傳遞參考
    Console.WriteLine("呼叫後 myNum = {0}", myNum); // 變為 30
}

ref 參考傳遞結果

ref 要求呼叫前變數已初始化;out 則不要求初始化,但方法內必須指派值。

Main 方法:程式進入點

Main 是 C# 應用程式的啟動點,執行完畢即結束程式。常見簽名:

  • static void Main()
  • static void Main(string[] args)
  • static int Main()
  • static int Main(string[] args)

args 陣列接收命令列引數。

結構體與結構體方法

結構體(struct)是實值型別,適合輕量級資料封裝。可在結構體內定義方法:

struct Cloth
{
    public int Age;
    public string Sex;
    public string Style;
    public double Price;
    public double Discount;

    public double SellPrice()
    {
        return Price * Discount;
    }
}

// 使用
Cloth myCloth;
myCloth.Age = 2;
myCloth.Discount = 0.98;
myCloth.Price = 1000;
myCloth.Sex = "man";
myCloth.Style = "長褲";

Console.WriteLine("出售價格: {0}", myCloth.SellPrice());

結構體方法執行結果

委派:類型安全的函式指標

委派(delegate)是一種可儲存方法參考的型別,是事件機制的基礎。宣告語法類似方法簽名,但無方法主體:

delegate double ProcessDelegate(double param1, double param2);

static double Multiply(double a, double b) => a * b;
static double Divide(double a, double b) => a / b;

// 使用
ProcessDelegate process = new ProcessDelegate(Multiply);
Console.WriteLine("Multiply: {0}", process(16, 4)); // 64

process = new ProcessDelegate(Divide);
Console.WriteLine("Divide: {0}", process(16, 4)); // 4

委派執行結果

委派實例化時傳入目標方法,透過委派變數即可調用該方法。本質上委派是一個類別,封裝了方法指標。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved