函数应该只被调用一次

时间:2012-11-06 12:01:34

标签: c#

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




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

       return lstState;
    }

我从很多地方调用这个函数,因为这个状态列表将是相同的所以我希望这个函数应该只被调用一次,并且下次调用这个函数时它不应该重新创建整个列表。

我怎样才能在c#中实现这一目标。

2 个答案:

答案 0 :(得分:2)

记事。它仍然会被多次调用,但只完成一次完整的工作:

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. 允许早期来电者互相覆盖。
  4. 虽然最后看起来最浪费,但从长远来看它可能是最好的,因为在不同的呼叫可能不必要地相互覆盖的初始阶段之后,从那时起它变得更简单和更快。这实际上取决于完成了多少工作,以及在_states被分配之前可以同时调用的频率。

答案 1 :(得分:1)

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

我当然不会为懒惰的实例化而烦恼;在构造函数中填充它并完成:

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

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