我的应用程序使用序列化从磁盘上的文件加载XML数据集,将该数据集保存在内存中以进行各种操作,然后在关闭时将数据集序列化回磁盘。目前,存储该数据集的对象是MainForm类的子属性。我可以使用MainForm.MyDataSet从其他类访问它。
但是,我想在MyDataSet的存储方面实施更好的实践。在理想的世界中,我认为它应该是静态的,但这可以防止XML的反序列化。我试着让它成为一个单身人士,但单身人士的实例仍然需要在某个地方“活着”。
在这种情况下,最佳做法是什么?
答案 0 :(得分:2)
这实际上取决于你对单身人士的实施。如果你use the static reference of the class strategy,这几乎是常态,那么单例类就是持有实例。 (这就是重点。)
using System;
public class MyDataset
{
private static MyDataset instance;
// TODO: add property that is holding the dataset
private MyDataset() {}
public static MyDataset Instance
{
get
{
if (instance == null)
{
instance = new MyDataset();
}
return instance;
}
}
}
答案 1 :(得分:1)
如果您愿意,可以使用Static类(在针对FrameWork 2.0和4.0编译的VS 2010 beta 2中进行测试)。
这里我们只是使用静态方法(获取和设置私有实例)来解决您不能拥有静态属性的事实。我看到的唯一真正的区别是,将这种方法与使用Public类进行比较,就像在AlphaZero的出色响应中那样,因为你永远不能使用'new on static class ...你有一点额外的“单身” -ness“:)
<注1:我刚开始自己“探索”这个区域,所以我非常欢迎任何评论,反馈,这里显示的示例代码:我在这里学习:)>
<注意2:我真正质疑的一件事是我是否在私有DataSet实例的“延迟实例化”中的readXMLintoDataSet方法中“做了正确的事”:如果DataSet实例已经实例化,可能使用Clear()是不够的?也许“正确的事情”是总是在它上面使用Dispose()并重新实例化它? >
<注3:我在这里使用超长的变量/方法名称...我希望...让代码通信:是的,你必须键入类似的东西:
TestStaticXMLDataSet.readXMLintoDataSet("someXML.xml");
使用此代码...假设您的使用者类位于不同的命名空间中...而且,显然,如果您使此类共享使用者类命名空间,则可以缩短其使用语法。 >
using System.Xml;
using System.IO;
using System.Data;
namespace TestStaticXMLDataSet
{
public static class DataSetClass
{
internal static DataSet _dataSet;
public static void setDataSet(DataSet incomingDataSet)
{
_dataSet = incomingDataSet;
}
public static DataSet getDataSet()
{
return _dataSet;
}
public static void readXMLintoDataSet(string filePath)
{
if (_dataSet == null)
{
_dataSet = new DataSet();
}
else
{
_dataSet.Clear();
}
_dataSet.ReadXml(filePath);
}
public static void writeDataSetToXML(string filePath)
{
if (_dataSet == null)
{
return;
}
else
{
_dataSet.WriteXml(filePath);
}
}
}
}