函数应该只被调用一次

问题描述:

我有一个c#函数,它返回状态列表。我希望这个函数只能像静态变量一样被调用一次。函数应该只被调用一次

 



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

     return lstState; 
    } 

,因为这种状态列表将是同我打电话是从很多地方这个功能,所以我想这个功能应该被调用一次,当该功能获取调用它不应该再创造下一次整个名单再次。

我怎么能在c#中实现这一点。

+1

在每个调用中返回相同的(static?)列表。 –

+0

请上传你的代码在这里............. – andy

+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之前可能同时调用的频率。

+0

您可以使用双重检查锁定,或者更简单地说,您可以放弃懒惰实例化的麻烦,并且只是预先创建列表。内存或CPU中没有足够的开销来创建状态列表来保证工作量。 –

重复使用列表的一个问题是,调用者可以修改此列表,这将影响对其的任何预先存在的引用。对于如此少量的数据,从长远来看这不太可能为您节省很多。我可能会满足于每次都返回一个新数组。

我当然不会懒得懒惰的实例化;填充它在构造和来完成:

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

现在是线程安全的,(相对)防篡改的,并且最重要的,简单的。