3

次のようなクラスが必要です。

public class Forest<S, T>
{
    static IList<Animal> coolGuys = new List<Animal>();
}

しかし、私はcoolGuys本当に静的でありたいと思っています。つまり、アプリケーションの存続期間全体を通じて一意である必要があります。そして今はそうではありません。MS はこのパターンを思いとどまらせます、と ReSharper は警告しますが、どうすれば私が望むものを本当に達成できるのでしょうか?

別の静的クラスを作成し、そこにパブリック静的フィールドを作成するか、別のシングルトン クラスにパブリック インスタンス フィールドを作成して、さらに作業を行う必要があるかもしれません。静的フィールドだけを保持する冗長な public クラスを使用しても問題ありませんが、回避したいのはフィールドが public/internal であることです。つまり、なぜ一貫性のないものを外の世界にさらすのかというcoolGuysことです。Forest<,>

public class Forest
{
    public static IList<Animal> coolGuys = new List<Animal>(); //want to avoid
}

public class Forest<S, T>
{
    Forest.coolGuys.Add(cutie);
}

より良いパターンはありますか?

4

1 に答える 1

8

アプローチ 1 - 状態プロバイダーを挿入する

  1. データを格納する型を作成します。
  2. インターフェイスで抽象化して、必要に応じて別のプロバイダーを挿入できるようにします (テストなど)。
  3. クラスを消費することは、ステートフル性を保証することを除いて、実装を気にしません。
  4. コンカレント ディクショナリは、スレッド セーフを処理します。
public interface IStateProvider
{
    void Store( string key, object value );
    object Get( string key );
}

public class StateProvider : IStateProvider
{
    private static ConcurrentDictionary<string, object> _storage = new ConcurrentDictionary<string, object>();

    public void Store( string key, object value )
    {
        // add to storage
    }

    public object Get( string key )
    {
        // get from storage
    }
}

public class Forest<T1, T2>
{
    private IStateProvider _stateProvider;

    public Forest( IStateProvider stateProvider )
    {
        _stateProvider = stateProvider;
    }

    public void Foo()
    {
        // do something with the stateful value
    }
}

// of course, you could do this with a DI framework
var stateProvider = new StateProvider();
var forest = new Forest<Foo, Bar>( stateProvider );

アプローチ 2 - 基本クラス

このアプローチは洗練されていませんが、もう少し簡単です。

public abstract class ForestBase
{
    private static List<object> _staticList = new List<object>();

    protected List<object> StaticList
    {
        get { return _staticList; }
    }
}

public class Forest<T1, T2> : ForestBase
{
    public void Foo()
    {
        StaticList.Add( 12345 );
    }
}

これにより、内部データが隠され、静的リストのインスタンスが 1 つだけになるのに対し、ジェネリック引数の組み合わせごとにインスタンスが 1 つになります。

于 2013-04-21T06:10:56.573 に答える