2

想象一下,有 3 个项目。一个库和 2 个可执行文件。

这两个程序都使用该库。项目 1,在其中创建许多类实例,并使用序列化程序保存它们。项目 2,加载它们,但永远不要对它们进行任何更改。

因此,对于项目 2,它应该是只读的,但项目 1 应该拥有对它的完全访问权限。我该如何设计?

可以说,图书馆中有这个类:

public string Name { get; private set;} 
public int Age { get; private set;}

public Person(string Name, int Age)
{
   this.Name = Name;
   this.Age = Age;
}

这对于项目 2 来说是完美的,后者将其用作只读文件。

但是对于项目 1 来说非常烦人,因为只要它只更改类中的一个属性,就必须创建一个全新的实例。拥有 2 个属性时并不烦人,但拥有 10 个属性时非常烦人。当这些值为 const 时,项目 2 甚至会很高兴。

设计它的最佳方法是什么?

4

2 回答 2

2

接口是做这样的事情的方式。

public IPerson
{
    string Name { get; }
    int Age { get; }
}

在项目 1 中:

public class Person : IPerson
{
    public string Name { get; set;} 
    public int Age { get; set;}

    public Person(string name, int age)
    {
       this.Name = name;
       this.Age = age;
    }
}

在项目 2 中:

public class Person : IPerson
{
    public readonly string _name;
    public string Name { get { return _name; } } 

    private readonly int _age;
    public int Age { get { return _age; } }

    public Person(string name, int age)
    {
       this._name = name;
       this._age = age;
    }
}

请注意,真正的不可变类使用只读字段而不是私有设置器。
私有 setter 允许实例在创建后修改其状态,因此它不是真正不可变的实例。
而只有在构造函数中才能设置一个 reaonly 字段。

然后您可以通过扩展共享相同的方法:

public static class PersonExtensions
{
    public static string WhoAreYou(this IPerson person)
    {
        return "My name is " + person.Name + " and I'm " + person.Age + " years old.";
    }
}
于 2013-04-22T16:35:54.927 回答
1

条件编译可以做到这一点,只需在 Visual Studio 中创建新的构建配置并使用条件编译符号,然后包装所有可写语句,以便它们使用一种配置而不是另一种配置进行编译,例如:

public string Name { 
    get; 
#if WriteSupport
    private set;
#endif
} 
public int Age { 
    get; 
#if WriteSupport
    private set;
#endif
}

public Person(string Name, int Age)
{
   this.Name = Name;
   this.Age = Age;
}
于 2013-04-22T17:38:25.703 回答