2

カスタムクラスを使用してユーザー設定を保存し、XMLシリアル化を使用して保存するとします。
プログラムが起動すると、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);

私は何が間違っているのですか?

4

2 に答える 2

2

これは論理的に「グローバル」な状態を表し、複数のインスタンスとして存在することを許可する必要があるものではないため、静的である必要があると考えるのは正しいことです。オブジェクトの実際のインスタンスが必要なので、適切な解決策はシングルトンを使用することです。これにより、シリアル化できるインスタンスが提供されますが、そのインスタンスはアプリケーション全体で公開でき、そのインスタンスが1つだけ存在することを確認できます。

于 2013-02-14T15:28:33.090 に答える
2

はい、シングルトンにします:

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
于 2013-02-14T15:29:45.797 に答える