我正在编写一个操作某些对象的程序,我们称之为“单词”。每个单词都是几个类之一的实例。一次可以有很多这样的东西。
这些Word对象中的每一个都需要访问存储在XML文件中的字典。我不认为每个Word对象应该单独加载XML文件。 Word对象应该能够访问一些全局程序数据池。
处理这个问题的最佳方法是什么?我应该有一个名为ProgramData的类,它包含XML文档,并在创建时传递给每个Word对象吗?这不会导致XML文件的多个实例被加载到内存中,不是吗?如果不将ProgramData传递给每个新对象,我可以做我想做的事吗?
答案 0 :(得分:2)
您应该将XML文件加载到ProgramData
的一个实例中,然后将该实例传递到每个Word
实例(可能在构造函数中)。您还可以在开始实例化Word
之前在Word
类中创建一个静态属性,但请确保使用lock
来保证线程安全。
您的替代方案是Singleton pattern,但相信我,您don't want to go down that road。
编辑:为了更清楚,这是第一个选项(我使用的那个):
public class Word
{
private ProgramData _Data
public Word(ProgramData data)
{
_Data = data;
}
public void MethodThatUsesData
{
// _Data.TryGetValue()
}
}
// in your main method or initialization routine:
ProgramData data = MethodThatLoadsData();
Word w = new Word(data);
答案 1 :(得分:1)
您的ProgramData类可以为XmlDocument提供静态变量,因此您不必通过构造函数传递变量;你的其他类只能引用ProgramData.YourVariable。
回答你的另一个问题,不,这种方法不会导致XML文件的多个实例被加载到内存中,drharris的方法也不会。
另外,请记住,此信息适用于所有面向对象的编程语言(至少是我所知道的),而不仅仅是C#。如果在一个名为myMethod()的方法中将XML文档加载到内存中一次,而myMethod()只调用一次...猜猜看,该XML文档只会被加载到内存中一次。只有您编码的内容或其他开发代码(并且您直接或间接调用)才会发生。没有魔力。