【发布时间】:2011-10-09 12:16:07
【问题描述】:
在 Resharper 5 中,以下代码导致 list 的警告“参数可以使用基本类型声明”:
public void DoSomething(List<string> list)
{
if (list.Any())
{
// ...
}
foreach (var item in list)
{
// ...
}
}
在 Resharper 6 中,情况并非如此。但是,如果我将方法更改为以下内容,我仍然会收到该警告:
public void DoSomething(List<string> list)
{
foreach (var item in list)
{
// ...
}
}
原因是,在这个版本中,list 只枚举了一次,所以将其更改为IEnumerable<string> 不会自动引入另一个警告。
现在,如果我手动更改第一个版本以使用IEnumerable<string> 而不是List<string>,我将在方法主体中list 的两次出现时收到该警告(“IEnumerable 的可能多重枚举”):
public void DoSomething(IEnumerable<string> list)
{
if (list.Any()) // <- here
{
// ...
}
foreach (var item in list) // <- and here
{
// ...
}
}
我明白,为什么,但我想知道如何解决这个警告,假设该方法真的只需要 IEnumerable<T> 而不是 List<T>,因为我只想枚举项目而我不想要更改列表。
在方法的开头添加list = list.ToList(); 会使警告消失:
public void DoSomething(IEnumerable<string> list)
{
list = list.ToList();
if (list.Any())
{
// ...
}
foreach (var item in list)
{
// ...
}
}
我明白,为什么这会使警告消失,但对我来说它看起来有点像黑客......
有什么建议,如何更好地解决该警告并在方法签名中仍然使用最通用的类型?
好的解决方案应该解决以下问题:
- 不要在方法内部调用
ToList(),因为它会影响性能 - 没有使用
ICollection<T>甚至更专业的接口/类,因为它们会改变从调用者看到的方法的语义。 -
IEnumerable<T>上没有多次迭代,因此存在多次访问数据库或类似情况的风险。
注意:我知道这不是 Resharper 问题,因此,我不想取消此警告,但要解决根本原因,因为警告是合法的。
更新:
请不要关心Any 和foreach。我不需要帮助将这些语句合并为只有一个可枚举的枚举。
在这种方法中,它真的可以是多次枚举可枚举的任何东西!
【问题讨论】:
标签: c# .net resharper resharper-6.0