在c#中生成返回查找列表还是预加载静态列表更好?
我有一个简单的查找列表,用于在Silverlight中填充下拉列表。在这个例子中,我使用的是美国各州 我想知道是返回一个静态列表还是使用关键字更好。在下面两段代码中,哪一段是首选的,为什么 第1版:使用收益率回报在c#中生成返回查找列表还是预加载静态列表更好?,c#,silverlight,yield,C#,Silverlight,Yield,我有一个简单的查找列表,用于在Silverlight中填充下拉列表。在这个例子中,我使用的是美国各州 我想知道是返回一个静态列表还是使用关键字更好。在下面两段代码中,哪一段是首选的,为什么 第1版:使用收益率回报 public class States { public static IEnumerable<string> GetNames() { yield return "Alabama"; yield return "Alask
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代码的情况并非如此)。无论如何,返回类型表示意图,即提供一个只读列表,但它不能阻止“非法”操作。您的意思是在示例中
产生返回
?是的,它现在已修复。谢谢