您的位置:首页 > 编程语言 > C#

【C#高效编程50例】条目4: 使用Conditional特性而不是#if条件编译

2015-10-15 18:29 686 查看
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()


也不会被调用,得到的结果将是空。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: