Secondo la documentazione sulla classe ConditionalAttribute
:È previsto che ConditionalAttribute escluda intere righe o solo chiamate di metodo?
Applicando ConditionalAttribute a un metodo indica a compilatori che un chiamata al metodo non deve essere compilato in Microsoft Intermediate lingua (MSIL) a meno che il condizionale il simbolo di compilazione associato con ConditionalAttribute è definito.
Per me questo sta dicendo che l'attributo Conditional
altera solo il comportamento al livello di chiamata del singolo metodo. Ma si consideri il seguente frammento di codice:
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();
}
}
Confrontare le uscite di debug e build di rilascio:
DEBUG RELEASE Side effects! Side effects! More side effects! More side effects! Conditional method run. Side effects! More side effects! Conditional method run.
È questo il comportamento specificato da qualche parte? Avevo pensato che entrambe le versioni avrebbero dovuto avere lo stesso output tranne per le righe che leggevano "Esecuzione del metodo condizionale".
mia comprensione di '[condizionale]' è uguali ai suoi, e Penso che tu stia vedendo l'effetto di un'ottimizzazione che si verifica qui. Che aspetto ha IL in modalità di rilascio? –
È interessante notare che anche Visual Studio (o ReSharper?) Colora l'intera linea grigia/non utilizzata nel primo caso, se non definisci DEBUG. Considerando che nel secondo, colora la chiamata a ConditionalMethod() grigio/non usato. –
possibile duplicato di [Perché l'attributo condizionale di .NET causa la rimozione degli effetti collaterali?] (Http://stackoverflow.com/questions/410865/why-does-nets-conditional-attribute-cause-side-effects-to -be-removed) –