// 無參無回傳
void Greet() => Console.WriteLine("Hello");
// 有參有回傳
int Add(int a, int b) => a + b;
// 表達式主體 (C# 6+)
int Square(int x) => x * x;
// 區塊主體
int Factorial(int n)
{
if (n <= 1) return 1;
return n * Factorial(n - 1);
}
| 關鍵字 | 傳遞方式 | 說明 |
|---|---|---|
| (無) | 值傳遞 | 複製值/參考,呼叫者變數不受影響 |
ref | 參考傳遞 | 別名,呼叫者變數可被修改,呼叫前必須初始化 |
out | 輸出參數 | 同 ref,但呼叫前可未初始化,方法內必須指派 |
in | 唯讀參考 | 避免結構體複製,編譯器強制不可寫 (C# 7.2+) |
params | 參數陣列 | 可變數量引數,必須是最後一個參數 |
void Swap(ref int a, ref int b) { int t = a; a = b; b = t; }
bool TryParse(string s, out int result)
{
result = 0;
return int.TryParse(s, out result);
}
int Sum(params int[] numbers)
{
int sum = 0;
foreach (var n in numbers) sum += n;
return sum;
}
// 呼叫
int x = 1, y = 2; Swap(ref x, ref y); // x=2, y=1
TryParse("123", out int v); // v=123
Sum(1, 2, 3, 4, 5); // 15
ref/out/in 屬於簽章一部分 (可區分 void M(int) 與 void M(ref int))。委派是型別安全的函式指標,封裝方法簽章。支援多播 (鏈結多個方法)。
// 聲明委派型別
delegate double BinaryOp(double x, double y);
class Calculator
{
static double Add(double a, double b) => a + b;
static double Sub(double a, double b) => a - b;
static double Mul(double a, double b) => a * b;
static double Div(double a, double b) => a / b;
}
var op = new BinaryOp(Calculator.Add);
Console.WriteLine(op(3, 2)); // 5
// 多播
BinaryOp multi = Calculator.Add;
multi += Calculator.Sub;
multi += Calculator.Mul;
// 呼叫時依序執行,回傳最後一個結果
Console.WriteLine(multi(10, 5)); // 50 (10*5)
Action / Action<T...>:無回傳。Func<T..., TResult>:有回傳。Predicate<T>:回傳 bool。Func add = (a, b) => a + b;
Action print = Console.WriteLine;
// TAP 模式
public async Task DownloadAsync(string url)
{
using var http = new HttpClient();
return await http.GetStringAsync(url);
}
// 並行執行
var tasks = urls.Select(DownloadAsync);
var results = await Task.WhenAll(tasks);
async 修飾詞啟用 await。Task/Task<T>/ValueTask<T>。
using System.Runtime.InteropServices;
class NativeMethods
{
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern int MessageBox(IntPtr hWnd, string text, string caption, uint type);
}
// 呼叫
NativeMethods.MessageBox(IntPtr.Zero, "Hello", "P/Invoke", 0);
DllImport:指定 DLL、字元集、錯誤處理、呼叫慣例。MarshalAs:控制參數/回傳值封送 (字串、陣列、結構體)。SetLastError:保留 Win32 錯誤碼 (Marshal.GetLastWin32Error())。CalculateTotal)。in,輸出用 out,雙向用 ref,集合用 params/IEnumerable。async/await。函式是程式碼組織的基本單元。從參數傳遞語意、多載解析、委派多播、非同步狀態機到非受控互操作,掌握每層機制的語意、效能、正確性權衡,能寫出高品質、可維護、高效能的 C# 代碼。