1

我有一个简单的查找列表,我将使用它来填充 Silverlight 中的下拉列表。在此示例中,我使用的是美国各州。

我试图弄清楚返回静态列表或使用yield关键字是否更好。在以下两段代码中,哪个是首选,为什么?

版本 1:使用收益回报

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:返回列表

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;
    }
}
4

3 回答 3

1

我想我更喜欢这个清单。yield与此处的 List 相比,该方法可能提供的唯一优势是避免需要一次将所有元素保存在内存中,但无论如何您都会这样做。

于 2009-08-25T22:55:12.573 回答
1

您需要问自己的问题是:“我是否希望调用的代码GetNames能够修改列表?”

  • 如果答案是肯定的,则返回一个IList,隐含地说:“读写”
  • 如果答案是否定的,则返回一个IEnumerable,隐含地说:“只读”

无论如何,我认为您应该将状态名称放在资源文件中,而不是对它们进行硬编码(即使该列表在短期内不太可能改变......)

这是我要做的:

public static IEnummerable<string> GetNames()
{
    foreach(string name in _names) yield return name;
}

这样您就不会直接将列表暴露给“外部世界”

于 2009-08-25T23:32:33.730 回答
0

就我个人而言,我更喜欢 List 而不是迭代器,尽管我也会考虑将包含此类列表(可能是 XML,可能是纯文本)的资源嵌入到您的程序集中并在您的静态构造函数中读取它。

于 2009-08-25T22:55:14.850 回答