-8

状態のリストを返すc#関数が1つあります。この関数は静的変数のように一度だけ呼び出されるようにしたいです。



    public List GetStateList()
    {{
       リストlstState=new List();
       lstState.add( "State1");
       lstState.add( "State2");
       lstState.add( "State3");

       lstStateを返します。
    }

この状態リストは同じになるので、多くの場所からこの関数を呼び出しています。この関数を1回だけ呼び出す必要があります。次にこの関数を呼び出すときに、リスト全体を再作成しないでください。

どうすればC#でこれを達成できますか?

4

2 に答える 2

2

それを覚えておいてください。これは複数回呼び出されますが、完全な作業は 1 回だけ行います。

private List<string> _states; //if GetStateList() doesn't depend on object
                              //state, then this can be static.
public List GetStateList()
{
   if(_states == null)
   {
     List lstState=new List();
     lstState.add("State1");
     lstState.add("State2");
     lstState.add("State3");
     _states = lstState;
   }
   return _states;
}

スレッド化の問題に応じて、次のいずれかを実行できます。

  1. 全体をロックします。保証された単一の実行。
  2. への割り当てをロックし_statesます。初期段階で不要な作業が発生する場合がありますが、すべての呼び出し元が同じオブジェクトを受け取ります。
  3. 初期の呼び出し元が互いに上書きできるようにします。

最後の呼び出しが最も無駄に​​見えるかもしれませんが、長い目で見れば最良の呼び出しになる可能性があります。最初の期間の後、異なる呼び出しが不必要に相互に上書きされる可能性があるため、その時点からより単純で高速になります。実際には、どれだけの作業が行われるか、および_states割り当てられる前に同時に呼び出される可能性がある頻度に依存します。

于 2012-11-06T12:20:32.473 に答える
1

リストを再利用する際の問題の 1 つは、呼び出し側がこのリストを変更できることです。これは、リストへの既存の参照に影響します。このような少量のデータの場合、長期的にはあまり節約にはなりません。毎回新しい配列を返すだけで満足するでしょう。

私は確かに遅延インスタンス化を気にしません。コンストラクターに入力して完了です。

public static class States {
    static States() {
        All = Array.AsReadOnly(new string[] { "state1", "state2", "state3" });
    }
    public static readonly ReadOnlyCollection<string> All;
}

現在は、スレッドセーフで、(比較的) 改ざんが防止されており、何よりもシンプルです。

于 2012-11-06T13:06:30.377 に答える