谈谈C#中的预处理指令
简而言之,C#中的预处理器指令并非虾米高级的玩意儿,它并非可执行代码的一部分,只是对编译过程有所影响而已,它的作用并不如其在C和C++中那么重要,C#中的其它一些特性分担了许多C++中指令的功能,如定制特性。
C#中仅保留一些简单常用的预处理器指令。
#define 和 #undef
#define用来定义一个符号, 当然这个符号并不存在真正意义上的所谓的值,仅仅是表示一个符号的存在而已。相反,#undef用来删除该符号。他们必须定义在源文件的开始部分(using之前),一般情况下他们与#if结合起来使用
例如:
#define DEBUG
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
#if DEBUG
Console.WriteLine("ustbwuyi");
#endif
Console.Read();
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
#if DEBUG
Console.WriteLine("ustbwuyi");
#endif
Console.Read();
}
}
}
F5一下,该字符将被打印出来。
如果我们在#define DEBUG之后加上一行 #undef DEBUG,处在#if #endif之间的代码会变成灰色。重新运行该程序,字符将不会被打印。
#warning 和 #error
顾名思义,这两个指令用来产生警告和错误。如果我们定义了DEBUG这个符号。
static void Main(string[] args)
{
#if DEBUG
Console.WriteLine("ustbwuyi");
#warning "Don't forget to remove the code before delivery"
#endif
Console.Read();
}
{
#if DEBUG
Console.WriteLine("ustbwuyi");
#warning "Don't forget to remove the code before delivery"
#endif
Console.Read();
}
编译的时候将产生一条警告信息,如果把#warning换成#error,编译将无法通过,除非你用#undef删除该符号。
#line
该指令用来改变警告或错误信息中显示的文件名和行号。
static void Main(string[] args)
{
#if DEBUG
Console.WriteLine("ustbwuyi");
#line 9999 "myfile.cs"
#warning "Don't forget to remove the code before delivery"
#endif
Console.Read();
{
#if DEBUG
Console.WriteLine("ustbwuyi");
#line 9999 "myfile.cs"
#warning "Don't forget to remove the code before delivery"
#endif
Console.Read();
}
设置之后发现警告信息的文件和行号都改变了。
当然你也可以用#line default来恢复匹配。
#pragma
该指令用来禁用编译时产生的警告,它可以附加在类或者方法之上。 如:
#pragma warning disable
static void Main(string[] args)
{
#if DEBUG
Console.WriteLine("ustbwuyi");
#warning "Don't forget to remove the code before delivery"
#endif
Console.Read();
}
static void Main(string[] args)
{
#if DEBUG
Console.WriteLine("ustbwuyi");
#warning "Don't forget to remove the code before delivery"
#endif
Console.Read();
}
这种情况下警告就不会产生了。当然你也可以用#pragma warning restore来恢复该警告。
至于#if/#endif 以及 #region/#endregion就不说了。