在表格之间共享课程

时间:2013-02-14 15:26:20

标签: c# .net

假设我想使用自定义类来存储用户设置,并使用XML Serialize保存它。
程序启动时,它会反序列化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中运行此代码时,值为空。 (事实上​​,一切都是NULL):

       LoadUserSettings();
       UserSettings us = UserSettings.Instance;                    
       MessageBox.Show(us.FirstName + " " + us.LastName);

我做错了什么?

2 个答案:

答案 0 :(得分:2)

因为它表示逻辑上“全局”的状态而不应该允许作为多个实例存在的状态,所以你认为它应该是静态的。由于您需要拥有对象的实际实例,这意味着适当的解决方案是使用Singleton。这将为您提供一个可以序列化的实例,但该实例可以在整个应用程序中公开,并且您可以确定只会有一个实例。

答案 1 :(得分:2)

是的,请将其设为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