首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

VB.NET 透過委派存取呼叫者私有變數:原理可行但強烈不建議

     編輯:程式設計疑難解答

直接回答

技術上可行:透過委派或反射可存取呼叫者私有欄位,但嚴重違反封裝原則,極易導致維護災難。

為什麼不推薦?

  • 耦合度極高:被呼叫者強依賴呼叫者內部實現細節。
  • 重構地獄:呼叫者改變私有欄位名稱/型別/邏輯,被呼叫者即刻崩潰。
  • 安全性風險:繞過存取修飾詞,破壞類的不變約束。
  • 除錯困難:資料流向隱晦,難以追蹤狀態變更來源。

正規替代方案

場景推薦模式
需修改呼叫者狀態傳遞 介面 或 可變物件 (ByRef 參數、類實例)
需讀取呼叫者資料傳遞 必要參數 (ByVal) 或 資料傳輸物件 (DTO)
回呼/事件通知定義 事件/委派,呼叫者訂閱並自行處理內部邏輯
跨層共享狀態使用 共用服務/Context 物件 依賴注入

委派正規用法範例

' 定義委派型別
Public Delegate Sub UpdateUICallback(message As String)

' 被呼叫者接受委派
Public Sub DoWork(callback As UpdateUICallback)
    ' ... 工作邏輯 ...
    callback("進度 50%") ' 呼叫者決定如何處理訊息
End Sub

' 呼叫者
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim worker As New Worker()
    worker.DoWork(AddressOf Me.HandleUpdate) ' 傳遞自身方法
End Sub

Private Sub HandleUpdate(msg As String)
    Me.Label1.Text = msg ' 呼叫者自主更新私有 UI 元件
End Sub

結論

請拋棄「存取呼叫者私有變數」的念頭,改用參數傳遞、介面契約、事件回呼等標準解耦手段。

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