我最近正在瀏覽一些代碼,並考慮是否需要注意Debug.Assert
語句中的表達式,例如昂貴的操作或帶有副作用的表達式。但是,看起來編譯器對於完全刪除Assert
語句和內部表達式非常聰明。C#編譯器如何在發佈版本中刪除Debug.Assert?
例如,下面將只在調試打印構建:
static void Main(string[] args)
{
Debug.Assert(SideEffect());
}
private static bool SideEffect()
{
Console.WriteLine("Side effect!");
return true;
}
這會抱怨正在使用o
之前發佈的初始化建立:
static void Main(string[] args)
{
object o;
Debug.Assert(Initialize(out o));
o.ToString();
}
private static bool Initialize(out object o)
{
o = new object();
return true;
}
它甚至似乎停滯不前直到這樣的表達式(在兩種情況下打印「之後」):
static void Main(string[] args)
{
if (false) Debug.Assert(true);
Console.WriteLine("After");
}
我對編譯器在這裏的智能以及在Debug.Assert
被刪除時正確檢測病例的能力感到有點驚訝。所以,它讓我好奇......
- 該語句到底是如何刪除的?表達式樹必須在刪除語句之前構建,以正確執行上述
if
語句。 - 這裏的
System.Diagnostics.Debug
類是特別的,還是可以用類似的處理來構建你自己的方法? - 有什麼方法可以在這裏「欺騙」預處理器嗎?更好的是,在真實世界的代碼中可能會遇到哪些情況可能會遇到問題?
請參閱http://blogs.msdn.com/b/ericlippert/archive/2009/09/10/what-s-the-difference-between-conditional-compilation-and-the-conditional-attribute.aspx關於這個問題的一些想法。 – 2011-04-22 05:13:27