11

最近、辞書を初期化するのが面倒なsingeltonクラスで、2番目のスレッドが実際に入力される前にそれを使用しようとする問題が発生していました。そこで、Lazy<T>クラスを介して変数の初期化を実装しました。

これが私のコードです:

private static Dictionary<string, string> GroupDefaults
{
    get { return mGroupDefaults.Value; }
}
private static Lazy<Dictionary<string, string>> mGroupDefaults =
    new Lazy<Dictionary<string,string>>(delegate
    {
        Dictionary<string, string> defaults = new Dictionary<string, string>();
        foreach (KeyValuePair<string, UnitGroup> groupDef in Groups)
            defaults.Add(groupDef.Key, groupDef.Value.First().Key);
        return defaults;
    });

Lazy<T>これで問題が修正され、スレッドの問題を回避するために、怠惰な初期化を行う場所でクラスを使用することを定期的に行うことを検討しています。それで、基本的に私はこれが良い/一般的な習慣であるかどうか知りたいですか?それとも、パフォーマンスなどに悪影響を及ぼしますか?

4

4 に答える 4

12

パフォーマンスの制約の種類を知らずに言うのはかなり難しいですが、私の経験では、Lazy<T>この正確なサービスを提供するために1回限りの初期化がボトルネックになることはめったにありません(定義上、1回だけ発生するため)。それを使用することをお勧めします。

于 2012-06-28T01:15:28.360 に答える
4

ドキュメントから、私は次のことを見つけました:

Lazyコンストラクターでデリゲートが渡されない場合、valueプロパティに最初にアクセスしたときに、Activator.CreateInstanceを使用してラップされた型が作成されます。タイプにデフォルトのコンストラクターがない場合、実行時例外がスローされます。

Activator.CreateInstanceパフォーマンスに悪名高い方法です。ただし、それはあなたの場合は問題ではないようです。とにかく、dlevが言ったように、メソッドを一度呼び出すことは問題ではありません。あまり使用されていませLazy<T>んが、あなたの場合に使用しない理由は見当たりません。

于 2012-06-28T01:31:37.863 に答える
2

これがシングルトンの場合、静的コンストラクターが必要な場合があります。何かのようなもの:

class MySingleton
{
    static MySingleton()
    {
         Instance().InitDict();
    }
}
于 2012-06-28T01:27:00.070 に答える
1

意図された用途ではなく、Lazyを使用している可能性があると思います。Lazyは、初期化コストが高いものに使用されますが、オブジェクトの存続期間中は使用されない可能性があります。

GroupDefaultsライフタイムごとに少なくとも1回呼び出す場合GroupDefaultsは、コンテナのライフタイムの開始時にバックグラウンドスレッドで初期化して、初期化が完了する前に完了することを期待するのがより良い方法です(これにはクラスがあることはわかっていますが、それを見つけるためにMSDNを掘り下げる必要があります)

于 2012-06-28T01:17:21.363 に答える