【问题标题】:Returning another library's IEnumerable<T>返回另一个库的 IEnumerable<T>
【发布时间】:2015-02-14 06:17:18
【问题描述】:

我正在实现一个库,该库使用 Newtonsoft 的 LINQ to JSON 函数将 JSON 数据解析为各种 C# 对象。除了惰性与急切的方法之外,传递一些其他库的 IEnumerable 与将其转储到 List 然后返回是否有任何影响?这是否允许更好的垃圾收集或类似的东西?

public class SimpleClass
{
    public IEnumerable<string> Tags { get; private set; }

    // Assume the token passed is a valid array of strings.
    public void UpdateTags1(JToken token)
    {
        this.Tags = token["tags"].Values<string>();
    }

    public void UpdateTags2(JToken token)
    {
        this.Tags = new List<string>(token["tags"].Values<string>());
    }
}

【问题讨论】:

  • 我不这么认为。此时所有程序集都加载到内存中,您的库 dll 和 json.net 库 dll 之间基本上没有区别。特别是如果您在同一个应用程序域中工作并且不执行封送处理。
  • 顺便说一句,访问由 UpdateTags1() 分配的 Tag 可能会导致多个 IEnumerable 枚举到 JToken.Values()。所以我会改用ICollection&lt;string&gt; 并使用ToArray() 强制实现。
  • 是的,我知道这个问题。不过,这是一个低级库。假设任何使用它的开发人员都会自己将 IEnumerable 转换为 List 或他们想要的任何其他内容。 (至少理论上是这样……开发人员在现实中做什么是另一回事。)

标签: c# ienumerable linq-to-json


【解决方案1】:

Values&lt;string&gt;() 方法是在同一个程序集中还是在不同的程序集中完全没有区别。

但是,值得注意的是, 存在实际差异,具体取决于 Values&lt;string&gt;() 方法实际返回的内容。通常当返回IEnumerable&lt;T&gt; 的实例时,该序列是延迟执行的结果。 IE。在您评估序列之前,它实际上并不存在。

更重要的是,每次评估时都会重新创建它。根据评估,这可能是也可能不是问题。至少,这可能是一个性能问题。评估结果也有可能在评估之间发生变化。

当您不确定这不会成为问题时,转换为列表或数组通常是一个好主意,以确保您获得完全评估的序列。您可以像在您的示例中那样执行此操作,也可以通过调用例如结果上的ToList()ToArray() 扩展方法。

【讨论】:

    猜你喜欢
    • 2012-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多