Prenons l'exemple très simple de la méthode async:
static async Task myMethodAsync()
{
await Task.Delay(500);
}
Quand je compile ce avec VS2013 (pré-compilateur Roslyn) générés de machine d'état est une struct.
private struct <myMethodAsync>d__0 : IAsyncStateMachine
{
...
void IAsyncStateMachine.MoveNext()
{
...
}
}
Quand je le compile avec VS2015 (Roslyn) le code généré est ceci:
private sealed class <myMethodAsync>d__1 : IAsyncStateMachine
{
...
void IAsyncStateMachine.MoveNext()
{
...
}
}
Comme vous pouvez le voir Roslyn génère une classe (et non pas une structure (struct). Si je me souviens bien de la première mise en application de la async/await soutien dans l'ancien compilateur (CTP2012 je suppose) a également généré des classes, puis il a été changé à la structure de raisons de performances. (dans certains cas, vous pouvez éviter complètement de boxe et de tas d'allocation...) (Voir ceci)
Personne ne sait pourquoi il a changé de nouveau dans Roslyn? (Je n'ai pas de problème à ce sujet, je sais que ce changement est transparent et ne change pas le comportement de n'importe quel code, je suis juste curieux)
Edit:
La réponse de @Damien_The_Unbeliever (et le code source :) ) à mon humble avis explique tout. Le comportement décrit de Roslyn s'applique uniquement pour la version debug (et c'est nécessaire à cause de la CLR restriction mentionnée dans le commentaire). Dans le Communiqué il génère également un struct (avec tous les avantages que..). Si cela semble être une solution intelligente pour soutenir à la fois de Modifier et de Continuer et de meilleures performances dans la production. Intéressant, merci pour tous ceux qui ont participé!