数据管理 - 只读数据

时间:2010-07-02 17:26:17

标签: c# readonly

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

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

另外,我有一个DataManager类,负责管理程序中的人员。如果要添加,获取,查找或删除某个人,只能通过DataManager类执行此操作。

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

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

什么是可以实现这一目标的最佳班级结构?

5 个答案:

答案 0 :(得分:2)

好吧,你永远无法阻止人们100%改变价值观。他们总是可以经历反思。

但是,从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

答案 1 :(得分:1)

首先想到的两件事是:

1 - 使Person属性设置器受到保护,并使DataManager派生自Person

2 - 将Person属性设置器设置为内部,并将Person和DataManager放在它们自己的程序集中

答案 2 :(得分:1)

如果使用internal关键字在Person类中声明get / set访问器,则只有同一程序集中的对象才能访问它们。只要在同一个程序集中包含DataManager类,它就可以访问,程序集外部的任何代码都不会。

答案 3 :(得分:0)

使Person类不可变;也就是说,在其上创建所有字段readonly并仅提供属性getter,而不是setter。将所有字段的值传递给构造函数。

答案 4 :(得分:-1)

一个选项是将现有的Person类重构为DataManager的内部类(即DataManager.Person),然后按以下方式创建一个新的Person类:

public class Person
{
    private DataManager.Person person;

    public Person(Datamanager.Person person)
    {
        this.person = person
    }

    public int ID
    {
        get { return person.ID; }
    }

    ...
}

然后,在您的DataManager类中,您将执行以下操作:

public Person GetPerson(int id)
{
    DataManager.Person person = // get the person by ID
    return new Person(person);
}

现在外部代码可以访问只读Person类,但无法获得对读/写DataManager.Person的引用。