谈谈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();          
        }
    }
}

 

 

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

 

 

编译的时候将产生一条警告信息,如果把#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();          

} 

 

设置之后发现警告信息的文件和行号都改变了。 

 

 

 

当然你也可以用#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();          
}

 

 

这种情况下警告就不会产生了。当然你也可以用#pragma warning restore来恢复该警告。 

 

至于#if/#endif 以及 #region/#endregion就不说了。

 

 

 

 

posted @ 2011-03-22 02:23  ustbwuyi  Views(518)  Comments(0Edit  收藏  举报