c# - 数据管理 - 只读数据

标签 c# readonly

我正在用 C# 做一个项目,我遇到了以下问题:

我有一些数据类型的类,例如 Person 类,它保存有关一个人的信息。

另外,我还有一个DataManager类,负责管理我程序中的人员。如果您想添加、获取、查找或删除一个人,您只能通过 DataManager 类来完成。

问题是我不希望除 DataManager 类之外的任何人都能够更改 Person 对象。例如,如果有人调用 DataManager.getPerson(int ID),他们将获得一个 Person 对象,并且能够使用该 Person 对象的 setter 函数来更改其内容(名字、姓氏、身份证等)。

我想避免这种情况。我只希望 DataManager 类能够更改 Person 对象(通过 DataManager.changeFirstNameForPerson(int ID, string name) 等方法)。

可以实现该目标的最佳类结构是什么?

最佳答案

好吧,您永远无法阻止人们 100% 更改这些值。他们总是可以通过反射(reflection)。

但是,从 API 的角度来看,您可以将 Person 类的所有 getter 公开,并将所有 setter 公开。只要 Person 和 DataManager 类在同一个程序集中,DataManager 就可以很好地访问 setter,但引用该程序集的其他应用程序则不能。

public class Person
{
    public string Fname { get; internal set; }
}


public class DataManager
{
    public void ChangeNameForPerson(int id, string fname)
    {
        Person p = Person.GetById(id);
        // Inside the same assembly.  Setter is accessible
        p.Fname = fname;
    }
}

在程序集之外,你会有这个:

Person p = DataManager.GetPerson(1);
p.Fname = "asdf"; // Compile time error
DataManager.ChangeNameForPerson(1, "asdf"); // Works fine

关于c# - 数据管理 - 只读数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3167831/

相关文章:

c# - 从 html 助手中获取未编码的 html

c# - 直接扣除两个日期和扣除两天的TimeOfDay有什么区别?

c# - 将包含不同类型的两个集合相交

c# - CngKey.Create 不支持请求的操作

mysql - 如何通过命令行将 MySQL 临时设置为只读?

c# - 如何返回一个空的 ReadOnlyCollection

c# - 使用 SignalR 发送 JSON

c# - 内部类属性使除外部类外的所有访问类只读

objective-c - Objective-C 中的只读属性?

perl - Perl 进程之间共享只读内存