函数应该只被调用一次
问题描述:
我有一个c#函数,它返回状态列表。我希望这个函数只能像静态变量一样被调用一次。函数应该只被调用一次
public List GetStateList() { List lstState=new List(); lstState.add("State1"); lstState.add("State2"); lstState.add("State3"); return lstState; }
,因为这种状态列表将是同我打电话是从很多地方这个功能,所以我想这个功能应该被调用一次,当该功能获取调用它不应该再创造下一次整个名单再次。
我怎么能在c#中实现这一点。
答
记住它。它仍然会被调用多次,但只有做充分的工作一次:
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;
}
根据线程问题,您不妨之一:在整个事情
- 锁。保证一次执行。
- 将作业锁定为
_states
。早期可能会有一些不必要的工作,但所有的呼叫者都会收到同一个对象。 - 允许早期呼叫者相互覆盖。
虽然最后看起来最浪费的,也可以是从长远来看是最好的,作为初始时期,不同的呼叫可能不必要地相互覆盖后,就变成了简单,从这一点上更快。这实际上取决于完成了多少工作,以及在分配_states
之前可能同时调用的频率。
+0
您可以使用双重检查锁定,或者更简单地说,您可以放弃懒惰实例化的麻烦,并且只是预先创建列表。内存或CPU中没有足够的开销来创建状态列表来保证工作量。 –
答
重复使用列表的一个问题是,调用者可以修改此列表,这将影响对其的任何预先存在的引用。对于如此少量的数据,从长远来看这不太可能为您节省很多。我可能会满足于每次都返回一个新数组。
我当然不会懒得懒惰的实例化;填充它在构造和来完成:
public static class States {
static States() {
All = Array.AsReadOnly(new string[] { "state1", "state2", "state3" });
}
public static readonly ReadOnlyCollection<string> All;
}
现在是线程安全的,(相对)防篡改的,并且最重要的,简单的。
在每个调用中返回相同的(static?)列表。 –
请上传你的代码在这里............. – andy
这个问题似乎背叛了对“静态”意味着什么,或者预期结果是什么的严重误解。我们真的需要更多关于你真正想要什么的信息。 –