2012-05-10 42 views
1

我的一个同事开始使用此代码:检测与静态分析lambda表达式的滥用在VS2010

var newList = new List<>(); 

foreach(var item in otherList) 
{ 
    newList.Add(GetNewObjectFrom(item)); 
} 

ReSharper的正确标识的使用LINQ的在这里,并把它改为:

var newList = otherList.Select(o => GetNewObjectFrom(o)).ToList(); 

然而,拉姆达是不必要的,并且可以通过只传递该方法进一步简化:

var newList = otherList.Select(GetNewObjectFrom).ToList(); 

我的问题

Visual Studio 2010 Professional中的任何工具或者ReSharper的各种手臂扭曲都可以检测到应该进行的更改吗?我意识到最好的工具是第二套人类的眼睛,这就是从这个问题开始的地方......但是我的计算机完成的工作越多越好。

编辑:真棒,这是一个ReSharper错误。下面是一个示例程序:

using System.Linq; 

namespace ResharperMethodGroupBug 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var program = new NumberProgram(new NumberProcessor()); 
      program.Run(); 
     } 
    } 

    class NumberProgram 
    { 
     private readonly INumberProcessor numberProcessor; 

     public NumberProgram(INumberProcessor numberProcessor) 
     { 
      this.numberProcessor = numberProcessor; 
     } 

     static long SquareNumber(int n) 
     { 
      return n * n; 
     } 

     public void Run() 
     { 
      var listOfNumbers = Enumerable.Range(1, 100).ToList(); 

      // appropriately triggers "convert to method group" 
      var listOfSquares = listOfNumbers.Select(n => SquareNumber(n)); 

      // does not trigger "convert to method group" when it should 
      var listOfCubes = listOfNumbers.Select(n => this.numberProcessor.CubeNumber(n)); 

      // proof that a method group works here 
      var anotherListOfCubes = listOfNumbers.Select(this.numberProcessor.CubeNumber); 
     } 
    } 

    interface INumberProcessor 
    { 
     long CubeNumber(int n); 
    } 

    class NumberProcessor : INumberProcessor 
    { 
     public long CubeNumber(int n) 
     { 
      return n * n * n; 
     } 
    } 
} 

编辑2:我已经张贴在JetBrains公司Youtrack一个问题:http://youtrack.jetbrains.com/issue/RSRP-301259

+0

Resharper已经检测到这一点,并建议简化。 –

+0

nuh-uh(15个字符)(也试图R#7.0构建看看是否有这样做) –

+0

我发布我的意见之前检查过,我可以向你保证它确实检测到它(VS2010 Pro SP1,Resharper 5.1.3) –

回答

3

ReSharper的已经检测到了这一点,并建议简化:

static void Main(string[] args) 
    { 
     var items = new[] { 1, 2, 3 }; 
     var list = items.Select(i => Foo(i)).ToList(); // R# suggests "Convert to method group" 
    } 

    static int Foo(int i) 
    { 
     return i; 
    } 

(与测试VS2010 Pro SP1和R#5.1.3)

+1

似乎它将在方法是本地时检测到,但如果方法呈现为接口成员则不会。关闭使用R#提交错误报告。 –

+0

你会介意使用我上面发布的示例程序,看看你的R#版本是否检测到方法组? –

+1

@insta,刚刚尝试过,它在R#5.1.3中给出了相同的结果。我同意这是一个错误。 –