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

C# 私有成員的驚人真相:同類別實例間可互相存取 private 欄位

     編輯:關於C#

現象展示

一般認知: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 仍需反射;同類別測試法則不適用。

最佳實踐建議

  1. 僅在「本類別邏輯必要」時使用:如複製、比較、合併、工廠方法建立實例並初始化私有狀態。
  2. 避免在公共 API 洩露此行為:不要讓呼叫端依賴「傳入同類別實例即可竄改私有狀態」。
  3. 考慮 internal + 組件邊界:若需跨類別存取,提升為 internal 並限制於同組件,語意更清晰。
  4. Code Review 關注點:檢查是否濫用跨實例私有存取導致耦合失控。

結語

「同類別實例互存 private」是 C# 特有的語言語意。理解其設計初衷(類別為封裝單位),並在團隊規範中明確使用邊界,才能發揮其便利性而不淪為破壞封裝的溫床。

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