Selon la documentation sur la classe ConditionalAttribute
:Est-ce que ConditionalAttribute est censé supprimer des lignes entières ou seulement des appels de méthode?
Application ConditionalAttribute à une méthode indique aux compilateurs qu'un appel à la méthode ne doit pas être compilé en langage intermédiaire Microsoft (MSIL) à moins que le conditionnel Le symbole de compilation associé avec ConditionalAttribute est défini.
Pour moi, cela signifie que l'attribut Conditional
modifie uniquement le comportement au niveau de l'appel de méthode individuel. Mais considérez l'extrait de code suivant:
class InstanceType
{
public InstanceType DoSideEffects()
{
Console.WriteLine("Side effects!");
return this;
}
public InstanceType DoMoreSideEffects()
{
Console.WriteLine("More side effects!");
return this;
}
[Conditional("DEBUG")]
public void ConditionalMethod()
{
Console.WriteLine("Conditional method run.");
}
}
class Program
{
static void Main()
{
var x = new InstanceType();
// The compiler appears to strip out this entire line
// in a Release build.
x.DoSideEffects().DoMoreSideEffects().ConditionalMethod();
var y = new InstanceType();
// When each method call appears on its own line,
// the first two methods are included as expected.
y.DoSideEffects();
y.DoMoreSideEffects();
y.ConditionalMethod();
}
}
Comparer les sorties de débogage et versions Release:
DEBUG RELEASE Side effects! Side effects! More side effects! More side effects! Conditional method run. Side effects! More side effects! Conditional method run.
Est-ce comportement spécifié quelque part? Je pensais que les deux builds étaient supposés avoir la même sortie à l'exception des lignes indiquant "Conditional method run".
Ma compréhension de '[conditionnelle]' est le même que le vôtre, et Je pense que vous voyez l'effet d'une optimisation se produire ici. A quoi ressemble l'IL en mode release? –
Fait intéressant, même Visual Studio (ou est-ce ReSharper?) Colore toute la ligne grise/inutilisée dans le premier cas, si vous ne définissez pas DEBUG. Alors que dans la seconde, il ne fait que colorier l'appel à ConditionalMethod() gray/unused. –
duplication possible de [Pourquoi l'attribut conditionnel de .NET provoque-t-il l'élimination des effets de bord?] (Http://stackoverflow.com/questions/410865/why-does-nets-conditional-attribute-cause-side-effects-to -be-removed) –