2012-05-10 38 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中給出了相同的結果。我同意這是一個錯誤。 –