前一篇文章记录了C#中流程控制语句的相关知识点,这篇则是介绍C#中的预处理器指令,C#预处理器的指令可以让编译器做许多C#基本语法所做不到的事情,这块我以前也仅仅是看过并没有实际使用过,正好这次乘着这次补习下,这篇文章记录了2点我认为对我来说比较实用的知识点。
以下是本文所要介绍的内容:
1、#IF与Debug、.NET版本
2、编译器的警告与禁用警告
3、其他常用预编译器指令
一、#IF与Debug、.NET版本
无论在什么情况下,if条件判断语句总是最常见的,而编译器的这个#IF则更为有用,比如可以#IF来判断当前的.NET版本,当前是还是release状态。
例如在DiscuzNt的代码中就有相应的示例,就是在debug状态如果访问论坛页面,那么在页面的底部就会将该页面所执行的所有SQL存储过程、存储过程参数值、执行时间进行显示,大大方便了日常调试、优化工作,如下图:
而相应的#IF预处理器指令实用起来也很方便,如下代码:
#define DEBUG
#if DEBUG
//dosomething
#endif
以上的代码事先使用#define来定义一个符号,然后通过#IF来判断是否为true,#IF的使用语法和VB.NET有点类似,需要以#endif结尾,否则会出错。
同时还可以通过#IF来判断当前的C#版本,如下代码:
#if CSHARP2
using System.Collections.Generic;
#endif
上面的代码则是判断如果当前.NET版本为C#2.0时引入System.Collections.Generic这个命名空间,这种在对于多版本支持的程序开发时很有用。
同样的在预处理器指令中还有#else,#elif这种与C#中if语法想同的指令,这样组合起来使用效果会更好,引用下MSDN的例子:
// preprocessor_if.cs
#define DEBUG#define VC_V7
using System;
public class MyClass
{
static void Main()
{
#if (DEBUG && !VC_V7)
Console.WriteLine("DEBUG is defined");
#elif (!DEBUG && VC_V7)
Console.WriteLine("VC_V7 is defined");
#elif (DEBUG && VC_V7)
Console.WriteLine("DEBUG and VC_V7 are defined");
#else
Console.WriteLine("DEBUG and VC_V7 are not defined");
#endif
}
}
以上的代码就是根据编译器的不用版本和状态来输出相应的字符串。
二、编译器的警告与禁用警告
在日常开发的过程中我们总是会经常对代码进行编译,而在编译的过程中会出现许多信息,许多无用的警告信息总是会在便一点过程中提示出来,以干扰一些主要的警告,对此也是可以通过预处理器指令来进行关闭来阻止其显示,常见的警告如下(CS1591、CS1573等):
例如其中的CS1591就是由于在为程序集生成DLL是同时生成XML注释时,没有指定相应的XML注释而产生的,对于此类常见的警告我们完全可以忽略或者关闭掉,因为其对程序没有任何影响,此时就可以通过#pragma warning来关闭或者开启,如下代码:
#pragma warning disable/restore 1591
其中disable/restore分别代表了禁用和开启警告,而后面的编号则代表了警告的编号,此处编写警告编号时无需以“CS”开头。
而这句代码只需书写在需要禁用或者开启的类文件中即可,这样此类对应的1591警告就不会出现了。
但是需要注意的是#pragma warning只对单个文件有作用,如果想禁用多个文件的警告可以使用编译器的/nowarn指令,具体可以见MSDN:点我进入
PS:#pragma 是一个单独的指令,而warning只是其中一个选项,#pragma的作用是:用于给编辑器提供特殊的指令,说明如何编译包含杂注的文件。
三、其他常用预编译器指令
预编译器指令还有许多,就不一一详解了,下面仅仅列举下并进行简单介绍,详细可以查看MSDN:点我进入
1、#undef,与#define对应,取消定义符号
使用方法:
#undef DEBUG
2、#warning,警告,用于自定义警告
使用方法:
#warning “这是一个警告”
3、#line,行号,改变编译器错误或警告报警的行号
使用方法:
12(实际行号) #line 50 “Program.cs” //更改行号为50
#line default //恢复默认行号
4、#error,错误,用于在特定位置生成错误
使用方法:
#error 这是一个错误
5、#region #endregion,折叠代码块
使用方法:
#region A
int a=0;
#endregion