2012-05-10 4 views
1

Un collègue de travail de la mine a commencé avec ce code:utilisation abusive Détection de lambdas avec l'analyse statique dans VS2010

var newList = new List<>(); 

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

ReSharper correctement identifié une utilisation de LINQ ici, et changé à:

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

Cependant , le lambda est inutile, et pourrait être encore simplifié en passant simplement la méthode:

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

Ma question:

Est-ce que n'importe quel outil dans Visual Studio 2010 Professional, ou divers bras de torsion de ReSharper, peut détecter cette modification? Je me rends compte que le meilleur outil est un deuxième regard humain, et c'est de là que vient cette question ... mais plus mon travail est fait par les ordinateurs, mieux c'est.

edit: génial, c'est un bug de ReSharper. Voici un exemple de programme:

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; 
     } 
    } 
} 

modifier 2: J'ai posté une question sur de JetBrains YouTrack: http://youtrack.jetbrains.com/issue/RSRP-301259

+0

Resharper détecte déjà cela et suggère la simplification. –

+0

nuh-uh (15 caractères) (essayant aussi de construire R # 7.0 pour voir si c'est le cas) –

+0

J'ai vérifié avant de poster mes commentaires, et je peux vous assurer qu'il le détecte (VS2010 Pro SP1, Resharper 5.1.3) –

Répondre

3

ReSharper détecte déjà et suggère la simplification:

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; 
    } 

(testé avec VS2010 Pro SP1 et R # 5.1.3)

+1

Semble qu'il détectera cela lorsque la méthode est locale, mais pas si la méthode est présentée en tant que membre de l'interface. Off pour déposer un rapport de bug avec R #. –

+0

cela vous dérangerait-il d'utiliser l'exemple de programme que j'ai posté ci-dessus et de voir si votre version de R # détecte le groupe de méthodes? –

+1

@insta, juste essayé, il donne le même résultat dans R # 5.1.3. Je suis d'accord c'est un bug. –

Questions connexes