在泛型类中需要一个真正的静态字段,否则如何保护它的可见性

本文关键字:何保护 可见性 保护 字段 泛型类 一个 静态 | 更新日期: 2023-09-27 18:10:07

我想有一个这样的类:

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

但是我希望coolGuys是真正静态的,这意味着它在应用程序的整个生命周期中必须是唯一的。但现在不是。MS不鼓励这种模式,ReSharper警告说,,但是如何才能真正实现我想要的呢?

可能是我将不得不做更多的工作,通过创建另一个静态类,并有一个公共静态字段一个公共实例字段在另一个单例类。有一个冗余的公共类来容纳一个静态字段是可以的,但我想避免的是字段是公共的/内部的。我的意思是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);
}

有更好的模式吗?

在泛型类中需要一个真正的静态字段,否则如何保护它的可见性

方法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 );
    }
}

这隐藏了内部数据,应该只给你一个静态列表实例,而不是每个泛型参数组合一个实例。