De acuerdo con la documentación de la clase ConditionalAttribute
:¿Se supone que ConditionalAttribute elimine líneas enteras, o solo llamadas a métodos?
Aplicando ConditionalAttribute a un método indica a los compiladores que una llamada con el método no debe ser compilar en Microsoft intermedia idioma (MSIL) a menos que el condicional El símbolo de compilación asociado con ConditionalAttribute está definido.
Para mí esto significa que el atributo Conditional
solo altera el comportamiento en el nivel de llamada del método individual. Pero considere el siguiente fragmento de código:
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();
}
}
Compare las salidas de depuración y las versiones de lanzamiento:
DEBUG RELEASE Side effects! Side effects! More side effects! More side effects! Conditional method run. Side effects! More side effects! Conditional method run.
¿Este comportamiento especificado en alguna parte? Pensé que se suponía que ambas construcciones tendrían el mismo resultado, excepto las líneas que decían "Ejecución de método condicional".
Mi comprensión de '[condicional] 'es el mismo que el suyo, y Creo que está viendo el efecto de una optimización que tiene lugar aquí. ¿Cómo se ve el IL en el modo de lanzamiento? –
Curiosamente, incluso Visual Studio (¿o es ReSharper?) Colorea toda la línea gris/sin usar en el primer caso, si no define DEBUG. Mientras que en el segundo, solo colorea la llamada a ConditionalMethod() gris/sin usar. –
posible duplicado de [¿Por qué los efectos colaterales de causa condicional de .NET se eliminarán?] (Http://stackoverflow.com/questions/410865/why-does-nets-conditional-attribute-cause-side-effects-to -be-removed) –