在泛型类中需要一个真正的静态字段,否则如何保护它的可见性
本文关键字:何保护 可见性 保护 字段 泛型类 一个 静态 | 更新日期: 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 -注入状态提供程序
- 创建存储数据的类型
- 用接口抽象它,这样你就可以在需要时注入不同的提供者(例如用于测试)。
- 消费类不关心实现,除了它保证有状态。
- 并发字典处理线程安全。
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 );
}
}
这隐藏了内部数据,应该只给你一个静态列表实例,而不是每个泛型参数组合一个实例。