1

我正在实现一个使用 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>());
    }
}
4

1 回答 1

1

Values<string>()方法是在同一个程序集中还是在不同的程序集中,根本没有区别。

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

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

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

于 2015-02-14T06:26:01.503 回答