【问题标题】:Why resharper does not suggest to use linq when interating over a List?为什么 resharper 在迭代列表时不建议使用 linq?
【发布时间】:2019-02-01 21:47:06
【问题描述】:

我在 Visual Studio 2017 中使用 Resharper 2018.1.3(我更新到 2018.2.0 并且遇到了同样的问题)。

当我输入此代码时:

var test = new List<string>();
var strings = new[] { "a", "b", "c" };
foreach (var a in strings)
{
    test.Add(a);
}

Resharper 建议将其转换为 LINQ 表达式。

但如果我使用List:

var test = new List<string>();
var strings = new List<string> { "a", "b", "c" };
foreach (var a in strings)
{
    test.Add(a);
}

Resharper 没有给我任何提示。为什么?

【问题讨论】:

标签: c# resharper


【解决方案1】:

虽然在这种特殊情况下转换为 LINQ 看起来很安全,但通常它可能会产生意想不到的副作用。 System.Collections.Generic.List 有一个 GetEnumerator 方法的特殊实现,它返回一个结构。 LINQ 方法适用于IEnumerable,其中GetEnumerator 方法返回接口IEnumerator 的实例。因此,将foreach 转换为 LINQ 可能会导致意外装箱。

在某些情况下,foreach 使用的GetEnumerator 方法和IEnumerable.GetEnumerator 的实现可能会返回完全不同的Enumerators,就像我们在IDictionary 中所做的那样,其中GetEnumerator 枚举DictionaryEntrys 而实现@ 987654334@ 在 System.Collections.Generic.Dictionary 的情况下迭代实际上是 KeyValuePair 实例的对象。

【讨论】:

  • 哦,这很有趣!您是否知道是否可以在所有情况下启用此提示?一般来说,我不关心那些微不足道的性能问题,但我确实关心可读性。
  • 不,在所有情况下都没有启用此提示的选项
猜你喜欢
  • 1970-01-01
  • 2012-03-05
  • 2019-11-06
  • 2012-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多