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

C# 函式完整指南:參數、回傳值、多載、委派、非同步與 P/Invoke

     編輯:關於C#

函式基礎語法


// 無參無回傳
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>。
  • 編譯器生成狀態機,非阻塞釋放執行緒。

P/Invoke:呼叫非受控代碼


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())。

最佳實踐總結

  1. 單一職責:函式做一件事,名稱動詞開頭 (CalculateTotal)。
  2. 參數設計:輸入用值/in,輸出用 out,雙向用 ref,集合用 params/IEnumerable。
  3. 不可變性:偏好傳回新物件而非修改參數。
  4. 非同步優先:I/O 操作全面採用 async/await。
  5. 委派解耦:回呼、策略、事件皆用委派/介面。
  6. P/Invoke 謹慎:正確宣告簽章、記憶體管理、錯誤處理,優先找 .NET 替代 API。

總結

函式是程式碼組織的基本單元。從參數傳遞語意、多載解析、委派多播、非同步狀態機到非受控互操作,掌握每層機制的語意、效能、正確性權衡,能寫出高品質、可維護、高效能的 C# 代碼。

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