关于silverlight:在c#中产生返回查找列表或预加载静态列表是否更好?

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

您需要问自己的问题是:"我想让调用GetNames的代码能够修改列表吗?"

  • 如果答案是肯定的,返回一个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/


我想我更喜欢这个单子。与这里的列表相比,yield方法可能提供的唯一优势是避免同时将所有元素保存在内存中,但无论如何您都要这样做。


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