一般認知:private 成員僅限類別內部存取。但 C# 允許同一個類別的不同實例互相存取彼此的 private 欄位/方法。
public class MyClass
{
private int i = 0;
public void Function()
{
MyClass a = new MyClass();
Console.WriteLine(a.i); // 編譯通過、執行正常!存取另一實例的 private 欄位
}
}
C# 語言規範明確規定:存取範圍以「類別」為邊界,而非「實例」。同一個類別的所有程式碼(包括靜態/實例方法、巢狀類別)皆可存取該類別宣告的任何
private成員,無論目標實例是否為this。
這與 Java、C++ 不同(C++ 需 friend,Java 同樣以類別為邊界但較少被利用)。
public MyClass(MyClass other) { this.id = other.id; } 直接讀取 other 的私有欄位。InternalsVisibleTo 存取 internal,但 private 仍需反射;同類別測試法則不適用。internal + 組件邊界:若需跨類別存取,提升為 internal 並限制於同組件,語意更清晰。「同類別實例互存 private」是 C# 特有的語言語意。理解其設計初衷(類別為封裝單位),並在團隊規範中明確使用邊界,才能發揮其便利性而不淪為破壞封裝的溫床。