回傳參考型別的唯讀屬性,呼叫端仍可透過參考修改內部物件狀態:
public class MyBusinessObject {
private DataSet _ds;
public DataSet Data => _ds; // 唯讀屬性
}
// 呼叫端
var ds = bizObj.Data;
ds.Tables.Clear(); // 內部資料被清空!
封裝邊界被繞過,類別失去對狀態變更的控制權。
string,本質安全無法修改。IListSource),隱藏具體實作方法。DataView),限制可執行操作。public class MyBusinessObject {
private DataSet _ds;
public IList this[string tableName] {
get {
var view = _ds.DefaultViewManager.CreateDataView(_ds.Tables[tableName]);
view.AllowNew = false;
view.AllowDelete = false;
view.AllowEdit = false;
return view; // 回傳介面,非具體 DataView
}
}
}
// 呼叫端
IList dv = bizObj["customers"];
foreach (DataRowView r in dv) Console.WriteLine(r["name"]);
DataViewManager 建立視圖,屬性鎖定新增/刪除/編輯。回傳 IList 介面進一步限制存取權。
若業務需允許外部修改(如資料繫結編輯),類別應訂閱內部資料事件(RowChanging, RowChanged),在事件處理常式中驗證與回應變更,維持狀態一致性。