1 #if条件编译的写法:
private void CheckStateBad()
{
#if DEBUG
string methodname = new StackTrace().GetFrame(1).GetMethod().Name;
Debug.Assert(lastname != null, methodname, "Last name cannot be null.");
#endif
}
在release方法中,就会留下一个CheckStateBad的空方法;虽然不做什么事,但方法的加载、JIT编译和调用也会有开销。
2 C#提供了更好的方法,Conditional特性
该特性可以标识出某种环境设置下该方法是否该被调用。
[Coditional("DEBUG")]
private void CheckStateBad()
{
string methodname = new StackTrace().GetFrame(1).GetMethod().Name;
Debug.Assert(lastname != null, methodname, "Last name cannot be null.");
}
编译器只有检查到DEBUG环境变量时才会调用该方法;但不会影响该方法的编译;
3 [Coditional("DEBUG"), Conditional("TRACE")]
两个条件是或的关系;
4 Conditional只能应用在整个方法上;且方法返回类型必须是Void;且最好不接受任何参数;
若要有参数,则可能有bug
例如:
[Conditional("DEBUG")]
private void SomeMethod(string par)
{
// code
}
然后调用这个方法:
Queue<string> names = new Queue<string>();
names.Enqueue("one");
string item = string.Empty;
SomeMethod(item = names.Dequeue());
Console.Write(item);
在release环境中somemehtod方法不会被调用,则
item = names.Dequeue()
也不会被调用,得到的结果将是空。