沒有類別,連最簡單的 C# 程式都無法編譯。本章涵蓋建構函式/解構函式、方法參數傳遞、多型覆寫、方法遮蔽等核心主題。
public,若類別僅含靜態成員可標記 private 防止實例化public TestClass(string name, int age) { ... }C# 解構函式 ~TestClass() 由垃圾收集器(GC)非同步呼叫,時機不可預測。若持有非受控資源(檔案控制代碼、資料庫連線、GDI+ 物件),必須實作顯式釋放方法:
public class TestClass : IDisposable
{
private IntPtr _handle; // 非受控資源
// 顯式釋放 - 供呼叫端主動呼叫
public void Dispose()
{
ReleaseResources();
GC.SuppressFinalize(this); // 告訴 GC 不需再呼叫解構函式
}
// 解構函式 - 防禦性程式,確保資源最終被釋放
~TestClass()
{
ReleaseResources();
}
private void ReleaseResources()
{
if (_handle != IntPtr.Zero)
{
CloseHandle(_handle);
_handle = IntPtr.Zero;
}
}
[DllImport("kernel32.dll")]
private static extern bool CloseHandle(IntPtr hObject);
}
最佳實務:呼叫端使用 using 區塊確保 Dispose() 被呼叫:
using (var obj = new TestClass())
{
// 使用資源
} // 區塊結束自動呼叫 Dispose()
預設行為:建立引數副本,方法內修改不影響原變數。適用於值型別與參考型別的參考本身。
public int CalcSquare(int side) => side * side;
// 呼叫
var result = CalcSquare(25); // 常數直接傳遞
ref)傳遞變數本身(位址),方法可修改原值。呼叫前必須初始化。
public void CalcSquare(ref int value)
{
value *= value; // 直接修改原變數
}
// 呼叫
int num = 20; // 必須初始化
CalcSquare(ref num); // num 變為 400
out)專為「傳回額外結果」設計,呼叫前不需初始化,但方法必須在返回前賦值。
public void CalcSquare(int side, out int result)
{
result = side * side; // 必須賦值
}
// 呼叫
int squared; // 無需初始化
CalcSquare(15, out squared); // squared = 225
| 特性 | 輸入 (預設) | ref | out |
|---|---|---|---|
| 呼叫端初始化 | 不需 | 必須 | 不需 |
| 方法內讀取 | 可 | 可 | 不可(未指派前) |
| 方法內寫入 | 僅影響副本 | 影響原變數 | 必須指派 |
| 適用場景 | 單純輸入 | 雙向資料流 | 多重回傳值 |
基類以 virtual 標記可覆寫方法,衍生類用 override 實作新行為。關鍵特性:即使透過基類參考呼叫,仍執行衍生類實作。
class Triangle
{
public virtual double ComputeArea(int a, int b, int c)
{
double s = (a + b + c) / 2.0;
return Math.Sqrt(s * (s - a) * (s - b) * (s - c)); // 海龍公式
}
}
class RightAngledTriangle : Triangle
{
public override double ComputeArea(int a, int b, int c)
{
// 驗證是否為直角三角形
const double epsilon = 0.0001;
if (Math.Abs(a * a + b * b - c * c) > epsilon)
return base.ComputeArea(a, b, c); // 呼叫基類實作
return a * b / 2.0; // 直角三角形面積公式
}
}
base.ComputeArea(...) 可顯式呼叫基類實作,避免重複程式碼public,衍生類不可改 protected)virtual 方法預設不可覆寫,這比 C++ 預設 virtual 更安全、效能更好IDisposable 模式out 解決多重回傳,ref 實現雙向修改virtual/override 實現執行期多型,base 關鍵字促進程式碼重用new)、屬性、索引子、事件等進階特性