-8

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



    公共列表 GetStateList()
    {
       列表 lstState=新列表();
       lstState.add("State1");
       lstState.add("State2");
       lstState.add("State3");

       返回 lst 状态;
    }

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

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

4

2 回答 2

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. 允许早期调用者相互覆盖。

虽然最后一个看起来最浪费,但从长远来看它可能是最好的,因为在不同调用可能不必要地相互覆盖的初始阶段之后,从那时起它变得更简单、更快。这实际上取决于完成了多少工作,以及_states在分配之前可以同时调用它的频率。

于 2012-11-06T12:20:32.473 回答
1

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

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

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

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

于 2012-11-06T13:06:30.377 回答