在窗体之间共享类
本文关键字:共享 之间 窗体 | 更新日期: 2023-09-27 17:59:02
假设我想使用自定义类来存储用户设置,并使用XMLSerialize保存它
当程序启动时,它会反序列化XML文件。我现在有一个包含所有用户设置的类。
我现在如何将这个类与我的应用程序中的所有其他表单共享
有比把它作为参数传递给构造函数更好的方法吗?
理想情况下,我会使用一个静态类,但它没有实例,因此不可序列化
我想要类似的。NET属性文件,该文件在任何地方都可以访问
(不幸的是,这只允许配对,这还不够好——因此我有自己的XML文件)
编辑:
根据我现在的答案:
[Serializable]
public sealed class UserSettings
{
private static readonly UserSettings _instance = new UserSettings();
private string _FirstName;
private string _LastName;
public static UserSettings Instance
{
get
{
return _instance;
}
}
static UserSettings()
{
}
private UserSettings()
{
//Constructor
}
public string FirstName
{
get { return _FirstName; }
set { _FirstName = value; }
}
public string LastName
{
get { return _LastName; }
set { _LastName = value; }
}
}
我已经将这个类的一个包含值的实例序列化并保存到一个文件中
我用这个代码来加载它:
private static void LoadUserSettings()
{
UserSettings us = UserSettings.Instance;
IFormatter formatter = new BinaryFormatter();
Stream stream = new FileStream(_AppSettingsFilePath, FileMode.Open, FileAccess.Read, FileShare.Read);
us = (UserSettings)formatter.Deserialize(stream);
stream.Close();
//System.Windows.Forms.MessageBox.Show(us.FirstName + " " + us.LastName);
}
当我读取LoadUserSettings函数中的属性(最后一行注释)时,它显示了保存的值
但是,当我在Form_load中运行此代码时,值为空。(事实上,所有内容都为空):
LoadUserSettings();
UserSettings us = UserSettings.Instance;
MessageBox.Show(us.FirstName + " " + us.LastName);
我做错了什么?
因为它代表的状态在逻辑上是"全局"的,而不是应该允许作为多个实例存在的东西,所以你认为它应该是静态的是正确的。由于您需要有一个对象的实际实例,这意味着适当的解决方案是使用Singleton。这将为您提供一个可以序列化的实例,但该实例可以在整个应用程序中公开,并且您可以确保只有一个实例
是的,使其成为Singleton:
public sealed class UserSettings
{
private static readonly UserSettings _instance = new UserSettings();
public static UserSettings Instance
{
get
{
return _instance;
}
}
static UserSettings()
{
}
private UserSettings()
{
// do constructor logic here
}
}
现在你可以这样访问它:
UserSettings.Instance.SomeProperty