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

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()

也不会被调用,得到的结果将是空。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值