Conditional是.net提供关于编译的属性描述,其作用是添加到方法或属上,通过定义编译符的方式告指示编译器应忽略方法调用或属性.在.NET中Debug 和 Trace 类中的方法都添加了这属性的定义,主要用于方便在编译的时候可以选择性编译相关调式和跟踪代码。那我们平时在写一个记录跟踪相关功能库的时候,是否有考虑过这东西呢?

            StopWatchExtend swe = new StopWatchExtend("test");
swe.Start("test");
Console.WriteLine("test");
swe.Start("test1");
Console.WriteLine("test1");
swe.End();

对于以上代码相信很多人不会陌生的,其实就是计算这个过程每块代码所损耗的时间。但问题在于很多时候只希望在debug下才做这样的操作,在release则是完全没有必要的。那这个时候我们一般想到的是使用预编译符。

#if DEBUG
StopWatchExtend swe = new StopWatchExtend("test");
swe.Start("test");
#endif
Console.WriteLine("test");
#if DEBUG
swe.Start("test1");
#endif
Console.WriteLine("test1");
#if DEBUG
swe.End();
#endif

这样的代码的确是让人蛋痛的事情,当然也可以选择在发布编译的时候注释到相关代码。显然这两种做法都是比较让人捉狂的……这个时候就可以通过Conditional来解决以上问题。只需要在StopWatchExtend方法添加相关Conditional即可。

        [Conditional("DEBUG")]
public void End()
{
if (mCurrentItem != null)
{
mStopWatch.Stop();
mCurrentItem.UseTime = mStopWatch.Elapsed.TotalMilliseconds;
mItems.Add(mCurrentItem);
mCurrentItem = null;
}
}
[Conditional("DEBUG")]
public void Start(string name)
{
if (mCurrentItem != null)
{
mStopWatch.Stop();
mCurrentItem.UseTime = mStopWatch.Elapsed.TotalMilliseconds;
mItems.Add(mCurrentItem);
mCurrentItem = null;
}
mCurrentItem = new WatchItem(name, 0);
mStopWatch.Reset();
mStopWatch.Start();
}
[Conditional("DEBUG")]
public void Start(string format, params object[] datas)
{
Start(string.Format(format, datas));
}

通过添加以上属性后,那编写前面的计时代码在发布的时候就会省上很多事情,只需要在编译项目里把DEBUG移走,那StopWatchExtend的End和Start方法都不会被编译过去.

有DEBUG生成的代码

	StopWatchExtend swe = new StopWatchExtend("test");
swe.Start("test");
Console.WriteLine("test");
swe.Start("test1");
Console.WriteLine("test1");
swe.End();

没有DEBUG生成的代码

	StopWatchExtend swe = new StopWatchExtend("test");
Console.WriteLine("test");
Console.WriteLine("test1");

.net好好地利用Conditional属性的更多相关文章

  1. C# 中利用 Conditional 定义条件方法

    利用 Conditional 属性,程序员可以定义条件方法.Conditional 属性通过测试条件编译符号来确定适用的条件.当运行到一个条件方法调用时,是否执行该调用,要根据出现该调用时是否已定义了 ...

  2. winform中ComboBox利用AutoComplete属性实现模糊查询(有缺陷)

    上一篇文章是用ComboBox里面的原生事件实现模糊查询,操作比较灵活一些,但是收到评论说,利用AutoComplete属性就可以实现模糊查询,但是据本人所了解,AutoComplete虽然能够方便的 ...

  3. Flex利用titleIcon属性给Panel容器标题部添加一个ICON图标

    Flex利用titleIcon属性,给Panel容器标题部添加一个ICON图标. 让我们先来看一下Demo(可以右键View Source或点击这里察看源代码): 下面是完整代码(或点击这里察看): ...

  4. 利用column-width属性设置多栏布局

    css样式设置为: div{ background:blanchedalmond; margin:0 auto; width:1230px; -moz-column-width:400px; -web ...

  5. bootstrap学习之利用CSS属性pointer-events禁用表单控件

    参考链接: CSS3 pointer-events:none应用举例及扩展 首先pointer-events在除去SVG中的应用只有两个值:AUTO | NONE pointer-events:non ...

  6. 利用referer属性,记录百度搜索跳转参数

    从百度搜索结果跳转到指定链接前,百度会发送一些参数,可以利用referer属性,在本站访问时记录百度跳转来之前的一些参数. 利用百度跳转前参数,进行一些相关的seo优化. 目前所用到的一些参数说明如下 ...

  7. [Flex] 组件Tree系列 —— 利用firstVisibleItem属性,设置或取得第一个显示节点

    mxml: <?xml version="1.0" encoding="utf-8"?> <!--功能描述: 利用firstVisibleIt ...

  8. CSS3利用text-shadow属性实现多种效果的文字样式展现

    一.效过图展示: 已经是比较久之前学习的文字效果了.但是还是很实用很有趣的.利用CSS3提供的text-shadow属性可以给页面上的文字添加阴影效果,因此可以替换掉之前使用过的一些繁琐的图片.到目前 ...

  9. 利用performance属性查看网页性能

    一般我们可以通过浏览器的调试工具-网络面板,或者代理工具查看网页加载过程中的各个阶段的耗时.而利用window.performance属性则可以获得更为精确的原始数据,以毫秒为单位,精确到微秒. pe ...

随机推荐

  1. Jmeter中主要管理器功用

    不管是在使用jmeter进行性能测试还是接口自动化测试时经常用到各种管理器进行对参数的处理,但是有时候分不清几种管理器的具体用法,所以做个笔记,列一下吧(所列内容基于版本为3.2) 主要内容包含以下: ...

  2. AAC编码学习

    AAC音频编码 https://www.jianshu.com/p/af0165f923e9 https://blog.csdn.net/u013427969/article/details/5309 ...

  3. Android- APP 秒开

    Android- APP 秒开 1. 启动APP 时白屏或者黑屏 现象:当启动APP 时,会有一个白屏或者黑屏一闪而过,然后才会显示出主界面. 这是因为,我们新打开一个应用,系统会为这个应用创建一个进 ...

  4. Unity Rain Ai 插件基本使用(二)

    前言 在前面的教程中我们已经基本实现了路径导航和障碍物规避. 但是这样我们并没有让我们的角色学会思考,他只是机械的去完成一些步骤,这并不能体现Rain插件的智能. 一个角色他应该有多个不同的状态,待机 ...

  5. Vue.js的安装及简单使用

    一.Vue简介 二.Vue.js的安装 2.1.npm安装 2.1.1.node.js介绍及安装 简介: 简单的说 Node.js 就是运行在服务端的 JavaScript. Node.js 是一个基 ...

  6. Java 基础 JRE和JDK的区别

    JRE(Java Runtime Environment,Java运行时环境)是Java程序运行所需的软件环境,包含Java虚拟机和Java基础类库. JDK(Java Development Kit ...

  7. 用generator改写ajax

    function request(url) { // this is where we're hiding the asynchronicity, // away from the main code ...

  8. 最短路径问题—Dijkstra算法

    算法: import java.util.*; public class Main6 { public static int N = 1050; public static final int INF ...

  9. hashlib模块,shutil,模块 ,,xml 文件解析,configparser,模块,类,什么是类

    1 什么是hash hash是一种算法,该算法接受传入的内容,经过运算得到一串hash值 如果把hash算法比喻为一座工厂 那传给hash算法的内容就是原材料 生成的hash值就是生产出的产品 2.为 ...

  10. 如何查看ubuntu系统版本信息

    第一种方法: hadoop@master:~$ cat /proc/version Linux version 4.4.0-21-generic (buildd@lgw01-21):Linux内核版本 ...