为什么 resharper 不建议在遍历列表时使用 linq?
Why resharper does not suggest to use linq when interating over a List?
我在 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 没有给我提示。为什么?
虽然在这种特殊情况下,转换为 LINQ 看起来很安全,但通常它可能会产生意想不到的副作用。 System.Collections.Generic.List
有一个特殊的 GetEnumerator
方法实现,它 return 是一个结构。 LINQ 方法适用于 IEnumerable
,其中 GetEnumerator
方法 return 接口实例 IEnumerator
。因此,将 foreach
转换为 LINQ 可能会导致不需要的装箱。
在某些情况下,foreach
使用的 GetEnumerator
方法和 IEnumerable.GetEnumerator
的实现可以 return 完全不同于我们在 [=20] 中的 Enumerator
=] 其中 GetEnumerator
枚举超过 DictionaryEntry
,而 IEnumerable.GetEnumerator
的实现迭代对象,在 System.Collections.Generic.Dictionary
.[=26= 的情况下,这些对象实际上是 KeyValuePair
的实例]
我在 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 没有给我提示。为什么?
虽然在这种特殊情况下,转换为 LINQ 看起来很安全,但通常它可能会产生意想不到的副作用。 System.Collections.Generic.List
有一个特殊的 GetEnumerator
方法实现,它 return 是一个结构。 LINQ 方法适用于 IEnumerable
,其中 GetEnumerator
方法 return 接口实例 IEnumerator
。因此,将 foreach
转换为 LINQ 可能会导致不需要的装箱。
在某些情况下,foreach
使用的 GetEnumerator
方法和 IEnumerable.GetEnumerator
的实现可以 return 完全不同于我们在 [=20] 中的 Enumerator
=] 其中 GetEnumerator
枚举超过 DictionaryEntry
,而 IEnumerable.GetEnumerator
的实现迭代对象,在 System.Collections.Generic.Dictionary
.[=26= 的情况下,这些对象实际上是 KeyValuePair
的实例]