Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在c#中生成返回查找列表还是预加载静态列表更好?_C#_Silverlight_Yield - Fatal编程技术网

在c#中生成返回查找列表还是预加载静态列表更好?

在c#中生成返回查找列表还是预加载静态列表更好?,c#,silverlight,yield,C#,Silverlight,Yield,我有一个简单的查找列表,用于在Silverlight中填充下拉列表。在这个例子中,我使用的是美国各州 我想知道是返回一个静态列表还是使用关键字更好。在下面两段代码中,哪一段是首选的,为什么 第1版:使用收益率回报 public class States { public static IEnumerable<string> GetNames() { yield return "Alabama"; yield return "Alask

我有一个简单的查找列表,用于在Silverlight中填充下拉列表。在这个例子中,我使用的是美国各州

我想知道是返回一个静态列表还是使用关键字更好。在下面两段代码中,哪一段是首选的,为什么

第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 ...";
    }
}
公共类状态
{
公共静态IEnumerable GetNames()
{
收益回报率“阿拉巴马”;
收益回报率“阿拉斯加”;
收益回报率“亚利桑那州”;
收益回报率“阿肯色州”;
收益回报率“加州”;
收益回报“他人…”;
}
}
版本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;
    }
}
公共类状态
{
私有静态只读IList_名称;
静态()
{
_名称=新列表(){“阿拉巴马”,
“阿拉斯加”,
“亚利桑那州”,
“阿肯色州”,
“加利福尼亚”,
“其他……”;
}
公共静态IList GetNames()
{
返回_名称;
}
}

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

就个人而言,我更喜欢列表而不是迭代器,不过我也会考虑嵌入包含此类列表的资源(可能是XML,也可能是纯文本)您需要问自己的问题是:“我是否希望调用
GetNames
的代码能够修改列表?”

  • 如果答案是“是”,则返回一个
    IList
    ,隐式地说:“读写”
  • 如果答案为否,则返回一个
    IEnumerable
    ,隐式地说:“只读”
无论如何,我认为你应该把州名称放在一个资源文件中,而不是硬编码(即使这个列表在短期内不太可能改变…)

下面是我要做的:

public static IEnummerable<string> GetNames()
{
    foreach(string name in _names) yield return name;
}
公共静态IEnumerable GetNames()
{
foreach(字符串名在_name中)产生返回名;
}

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

对象在使用过程中仅在内存中这一事实会带来任何好处吗?或者加载超时会影响内存成本吗?请注意至少有人尝试:IList list=((IList)SomeMethodThatReturnsEnumerable())是的,这在技术上是可行的。。。前提是它实际上是一个IList(V1代码的情况并非如此)。无论如何,返回类型表示意图,即提供一个只读列表,但它不能阻止“非法”操作。您的意思是在示例中
产生返回
?是的,它现在已修复。谢谢