概述

    #if/#endif 语句常用来基于同一份源码生成不同的编译结果,其中最常见的就是debug版和release版。但是这些工具在实际应用中并不是非常友好,因为它们容易被滥用,其代码页进而难以理解或调试。C#设计中考虑到这个问题,并提供了更好的工具——Conditional特性,用来为不同的环境编译不同的机器码。Conditional特性适用于方法的层面,这将强制我们将条件代码拆分为独立的方法。在需要编写条件代码时,我们应该使用Conditional特性来替代#if/#endif。

功能描述

使用#if/#endif 语句的缺点

  例如编写一个私有方法来获取调用它的函数名称:

private string CheckMethod(){#if DEBUGTrace.WriteLine("Entering CheckState for Person");string methodName = new StackTrace().GetFrame(1).GetMethod().Name;return methodName;
#endifreturn null;}

更好的解决办法——使用Conditional特性

  为了避免出现上面的问题我们可以使用Conditional特性。使用Conditional特性即可将一些函数拆分出来,让其只有在定义了某些环境变量或者设置了某个值之后才能编译并成为类的一部分。Conditional特性最常用的地方就是讲一段代码变成调试语句。使用Conditional特性的隔离策略要比#if/#endif不容易出错。

看下面的代码:

       [Conditional("DEBUG")]private void CheckMethod(){Trace.WriteLine("Entering CheckState for Person");string methodName = new StackTrace().GetFrame(1).GetMethod().Name;}

Conditional特性的限制

Conditional特性只可以应用在整个方法上。

任何使用了Conditional特性的方法都只能返回void类型。

功能扩展

我们可以配置解决方案文件,来决定编译时候运行的代码,流程如下:

1、配置解决方案信息:

2、编写代码约束:

    [Conditional("IN_MEMORY")]private static void ConfigureInMemory(){................................................           }[Conditional("NHIBERNATE")]private static void ConfigureInMemory(){
      ................................................
     }

代码生成的时候,我们就可以根据Conditional来决定编译走的流程;

转载于:https://www.cnblogs.com/xibei666/p/5495561.html

C# 使用Conditional特性而不是#if条件编译相关推荐

  1. unity Conditional特性 总结

    除了用预处理指令来控制编译之外,在Unity中可以用Conditional特性来控制编译. 一.使用方法 [Conditional("Debug")] public static ...

  2. C#基础知识学习——特性(Conditional特性、Obsolete特性、自定义特性)(十六)

    特性:C#特性是指我们可以对类.以及C#程序集中的成员进行进一步的描述,比如我们写一个关于人的类Person,该类可以对人的属性以及某些行为(方法)进行描述.那么如果我们要对人类进行进一步描述呢,比如 ...

  3. C# Conditional 特性

    Conditional 特性简介 Conditional 特性允许我们包括或排斥特定方法的所有调用.为方法声明应用 Conditional 特性并把编译符作为参数来使用. 如果定义了编译符号,那么编译 ...

  4. Conditional 特性的使用

    当调用被[Conditional("预处理符号")]标记为条件的方法时,指定的预处理符号的存在或不存在决定是否包含或省略此调用.如果定义了该符号,则包含调用:否则省略调用.使用 C ...

  5. [.NET] 《Effective C#》快速笔记(一)- C# 语言习惯

    <Effective C#>快速笔记(一)- C# 语言习惯 目录 一.使用属性而不是可访问的数据成员 二.使用运行时常量(readonly)而不是编译时常量(const) 三.推荐使用 ...

  6. C#高效编程 改进C#代码的50个行之有效的办法(第2版)

    Effective  C# 50 Specific Ways to Improve Your C# Sencond Edition 第一章 C#编程习惯 条目1 使用属性而不是访问的数据成员 条目2 ...

  7. C#高效编程:改进C#代码的50个行之有效的办法(第2版)(奋斗的小鸟)_PDF 电子书

    下载地址:http://pan.baidu.com/share/link?shareid=1689099661&uk=721744522 QQ:2864670220  (提供电子书提取密码) ...

  8. [你必须知道的.NET] 第三回:历史纠葛:特性和属性

    本文将介绍以下内容: • 定制特性的基本概念和用法 • 属性与特性的区别比较 • 反射的简单介绍 1. 引言 attribute是.NET框架引入的有一技术亮点,因此我们有必要花点时间来了解本文的内容 ...

  9. C# 特性 Attribute

    特性就是在类的类名称.属性.方法等上面加一个标记,使这些类.属性.方法等具有某些统一的特征,从而达到某些特殊的需要.举个小栗子:方法的异常捕捉,你是否还在某些可能出现异常的地方(例如数据库的操作.文件 ...

最新文章

  1. Java开发命名规范总结
  2. 《互联网运营智慧》终于上市销售了
  3. python 字符串前加r和f
  4. python DB.fetchall()--获取数据库所有记录列表
  5. php 查询键名是否存在,PHP array_key_exists():检测键名是否位于数组中
  6. “QQ尾巴病毒”核心技术的实现
  7. 别让Vue3.0的谣言害了你!
  8. android高级资料
  9. opend和open的区别_open与open up的区别
  10. 前端web 技术盘点
  11. Java开发QQ机器人
  12. 天才在左,疯子在右,我们在哪?
  13. CentOS 6.5 安装Redis并设置开机自启动
  14. uni-app 实现微信分享
  15. 最新WIN_GHO系统(及OFC_PS8_FASH8_PY练习题)
  16. 我对“什么是程序(Program)”的理解
  17. 汉白玉产地在哪里_汉白玉产地是在哪里,有哪些种类?
  18. SQL注入POST注入
  19. 实验.cc域名与.com域名在百度的权重谁高谁低
  20. 计算机毕业设计ssm高校心理健康咨询平台vknhv系统+程序+源码+lw+远程部署

热门文章

  1. ACMer的AC福音!手动扩栈外挂!(防止栈溢出)
  2. PointNet++详解与代码
  3. Linux系统查看开放的端口、开启指定端口、关闭指定端口和查看及删除定时任务
  4. mysql授权 改表_mysql开启远程登陆(修改数据表和授权两种方法)
  5. java语言特点 字符串不变_面试必问:Java中String类型为什么设计成不可变的?
  6. Hessian Binary Web Service Protocol远程接口调用入门
  7. android nio debug模式正常 release包crash_Flutter包大小治理上的探索与实践
  8. 分布式理论:CAP、BASE | 分布式存储与一致性哈希
  9. C++:14---虚继承,虚函数,多态
  10. nginx php 跨域访问权限,nginx + php 实现跨域请求填坑笔记