2015-07-14 13 views
6

Rozważ poniższy kod przykładowy.Różnica w statycznym wyrażeniu lambda kompilatora CSC i Roslyn?

class Program 
{ 
    static void Main(string[] args) 
    { 
     DoSomethingWithAction(i => 
      { 
       Console.WriteLine("Value: {0}", i); 
      }); 

     Console.ReadLine(); 
    } 

    private static void DoSomethingWithAction(Action<int> something) 
    { 
     Console.WriteLine(something.Target == null 
      ? "Method is static." 
      : "Method is not static."); 

     something(5); 
    } 
} 

Jeśli mogę skompilować i uruchomić ten kod pod Debug pomocą Visual Studio 2010 (pod CSC kompilatora) będzie wydrukować następujący wynik:

Method is not static. 
Value: 5 

Jeśli mogę skompilować ten sam kod visual Studio 2010, ale tym razem przy użyciu Release ustawienia następujące wyjścia zostanie wygenerowany:

Method is static. 
Value: 5 

Teraz, gdy byliśmy na wykonanie tego samego kodu, ale tym razem przy użyciu programu Visual Studio 2015 CTP (pod kompilator Roslyn), następujące wyjściowe są generowane zarówno Debug i Release ustawieniami:

Method is not static. 
Value: 5 

Pierwszych Ciekaw jestem, że istnieje różnica między wersjami VS2010 (CSC) Debugowania i Release. Dlaczego nie byłaby to metoda statyczna podczas debugowania? Ponadto, wydaje się, że w niektórych przypadkach ocenia się jako statyczny podczas kompilacji w debugowaniu. Mam aplikację produkcyjną, która uzyskuje oczekiwany wynik statyczny w obszarze Debugowanie.

Po drugie, czy kompilator Roslyn powinien pasować do zachowania CSC w tym konkretnym przypadku?

+1

IL nie ma pojęcia lambdy. Lambdy są kompilowane do anonimowego typu. Jak pokazuje połączone pytanie, kompilator może generować statyczne metody, jeśli nie są zaangażowane żadne zamknięcia. Twój kod nie powinien być zależny od takiego zachowania, jest to ściśle związane z implementacją i optymalizacją kompilatora. –

+2

@PanagiotisKanavos Tak, rozumiem dlaczego i zgadzam się z tobą, że kod nie powinien zależeć od tego zachowania, jest to po prostu coś, co znalazłem i Ciekawi mnie różnica. Nie zgadzam się, że to pytanie było duplikatem połączonego pytania. Moje pytanie rozumie, że może spowodować, że metody staną się statyczne, jeśli nie zostaną zamknięte. Moje pytanie polegało głównie na pytaniu, dlaczego kompilator Roslyn zdecydowałby się nie robić tego w ogóle. – deloreyk

+0

Zobacz https://roslyn.codeplex.com/workitem/246, co wyjaśnia, dlaczego wprowadzono tę zmianę. – SLaks

Odpowiedz

11

To była przemyślana zmiana dokonana przez zespół Roslyn.

Delegaci, którzy wskazują metody instancji są nieco szybsze do wywołania, więc Roslyn teraz kompiluje lambdy do metod instancji nawet wtedy, gdy nie musi.

Zobacz discussion.

Powiązane problemy