【问题标题】:Is it better to yield return lookup lists or preload a static list in c#?在 C# 中生成返回查找列表或预加载静态列表更好吗?
【发布时间】:2009-08-25 22:49:51
【问题描述】:

我有一个简单的查找列表,我将使用它来填充 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;
    }
}

【问题讨论】:

    标签: c# silverlight yield


    【解决方案1】:

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

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

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

    这是我要做的:

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

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

    【讨论】:

    • 小心至少有人尝试:IList list = ((IList) SomeMethodThatReturnsEnumerable())
    • 是的,这在技术上是可行的……前提是它实际上 一个 IList(V1 代码不是这种情况)。无论如何,返回类型表明了意图,即提供一个只读列表,但并不阻止“非法”操作。
    • 您的意思是您的示例中的yield return
    • 是的,现在已修复。谢谢!
    【解决方案2】:

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

    【讨论】:

    • 对象在使用期间仅在内存中这一事实是否会带来任何好处?还是加载时间会超过内存成本?
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2014-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多