預設情況下,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
}

但此法無法同時修改多個參數。
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 要求呼叫前變數已初始化;out 則不要求初始化,但方法內必須指派值。
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

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