Biorąc pod uwagę następujący kod:Delegowanie zmiany zachowań buforowanie w Roslyn
public class C
{
public void M()
{
var x = 5;
Action<int> action = y => Console.WriteLine(y);
}
}
Korzystanie VS2013, .NET 4.5. Patrząc na decompiled kodu, możemy zobaczyć, że kompilator jest buforowanie delegata w miejscu połączenia:
public class C
{
[CompilerGenerated]
private static Action<int> CS$<>9__CachedAnonymousMethodDelegate1;
public void M()
{
if (C.CS$<>9__CachedAnonymousMethodDelegate1 == null)
{
C.CS$<>9__CachedAnonymousMethodDelegate1 = new Action<int>(C.<M>b__0);
}
Action<int> arg_1D_0 = C.CS$<>9__CachedAnonymousMethodDelegate1;
}
[CompilerGenerated]
private static void <M>b__0(int y)
{
Console.WriteLine(y);
}
}
Patrząc na tym samym kodzie decompiled w Roslyn (używając TryRoslyn) daje następujący wynik:
public class C
{
[CompilerGenerated]
private sealed class <>c__DisplayClass0
{
public static readonly C.<>c__DisplayClass0 CS$<>9__inst;
public static Action<int> CS$<>9__CachedAnonymousMethodDelegate2;
static <>c__DisplayClass0()
{
// Note: this type is marked as 'beforefieldinit'.
C.<>c__DisplayClass0.CS$<>9__inst = new C.<>c__DisplayClass0();
}
internal void <M>b__1(int y)
{
Console.WriteLine(y);
}
}
public void M()
{
Action<int> arg_22_0;
if (arg_22_0 = C.<>c__DisplayClass0.CS$<>9__CachedAnonymousMethodDelegate2 == null)
{
C.<>c__DisplayClass0.CS$<>9__CachedAnonymousMethodDelegate2 =
new Action<int>(C.<>c__DisplayClass0.CS$<>9__inst.<M>b__1);
}
}
}
możemy teraz zobaczyć, że pełnomocnik jest teraz podnoszone do prywatnej klasy wewnątrz C
, podobnego zachowania, które jesteśmy przyzwyczajeni podczas zamykania nad zmiennej instancji/pola (zamknięcia).
Wiem, że jest to szczegół wdrożenia, który może ulec zmianie w dowolnym momencie.
Wciąż zastanawiam się, jakie są zalety przeniesienia delegata na nową klasę i zapisania go tam przez zwykłe zapisanie go w witrynie połączenia?
Edit:
This issue mówi o tym samym zachowanie jak zapytałem tutaj.
[Prawie, ale nie do końca dupe] (http://stackoverflow.com/questions/27725939/why-the-compiler-adds-an-extra-parameter-for-delegates-when-there-is-no- zamknięcie/27726206 # 27726206): zachowanie zmieniło się jeszcze raz? – hvd
@hvd Nie do końca, nie jest to spowodowane błędem, jest to zachowanie dla danego klienta z pamięci podręcznej w Roslyn. –
"Raport o błędzie"! = "Bug" :) Nigdy nie twierdziłem, że był błąd w tym drugim pytaniu, ani tutaj. – hvd