Is it better to yield return lookup lists or preload a static list in c#?
我有一个简单的查找列表,用于填充Silverlight中的下拉列表。在这个例子中,我使用的是美国各州。
我想知道返回静态列表还是使用yield关键字更好。以下两段代码中,哪一段是首选代码,为什么?
版本1:使用收益率返回
1 2 3 4 5 6 7 8 9 10 11 12 | public class States { public static IEnumerable<string> GetNames() { yield return"Alabama"; yield return"Alaska"; yield return"Arizona"; yield return"Arkansas"; yield return"California"; yield return"Others ..."; } } |
版本2:返回列表
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | public class States { private static readonly IList<string> _names; static States() { _names = new List<string>() {"Alabama", "Alaska", "Arizona", "Arkansas", "California", "Others ..." }; } public static IList<string> GetNames() { return _names; } } |
您需要问自己的问题是:"我想让调用
- 如果答案是肯定的,返回一个
IList ,隐含地说:"读写" - 如果答案为"否",则返回一个
IEnumerable ,隐含地说:"只读"
不管怎样,我认为您应该将状态名放在资源文件中,而不是对其进行硬编码(即使该列表在短期内不太可能更改…)
以下是我要做的:
1 2 3 4 | public static IEnummerable<string> GetNames() { foreach(string name in _names) yield return name; } |
这样你就不会直接把名单暴露给"外部世界"
这可能有助于解释为什么您应该使用v1 http://startbigthinksmall.wordpress.com/2008/06/09/behind-the-scenes-of-the-c-yield-keyword/
我想我更喜欢这个单子。与这里的列表相比,
我个人更喜欢列表而不是迭代器,不过我也会考虑将包含此类列表(可能是XML,也可能是纯文本)的资源嵌入到程序集中,并在静态构造函数中读取它。