注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

天涯倦客的博客

祝福你朋友永远快乐!

 
 
 

日志

 
 

C#预处理器指令  

2018-02-27 16:36:23|  分类: C# |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

 C#的预处理器指令很容易识别,你看到了#,就能认出它们。

  它和其他的命令有什么区别呢?

  区别在于这些命令从来不会转化为可执行代码的命令,但是会影响编译过程的各个方面。

  它用来做什么呢?

  当计划发布两个版本的代码的时候。即基本版和拥有更多版本的企业版,就可以用到预处理器指令。

  在编译基本版的时候,使用预处理指令会禁止编译器编译与额外功能相关的代码。

  另外,在编写提供调试信息的代码时,也可以使用预处理器指令。

  下面介绍预处理器指令的功能:

  #define和#undef

  #define用法:  #define Debug

  Debug可以看做是声明的一个变量,但此变量没有真正的值,仅存在。

  #define单独用没什么意义,一般是和#if结合使用。

  #undef用法:   #undef Debug

  作用就是删除Debug的定义。如果Debug符号不存在,这条指令就没有任何作用。如果Debug符号存在,则之前的#define就没有作用。 

  #define与#undef声明必须放在C#源文件的开头位置,即程序集的引用的上方。

 

  #if,#elif,#else和#endif

  下面来看一个例子  

复制代码
//#define DebugA
#define DebugB
using System;

namespace MyApplication
{
    class Program
    {
        static void Main(string[] args)
        {
#if DebugA
            Console.WriteLine("Hello DebugA");
#elif DebugB
            Console.WriteLine("Hello DebugB");
#else
            Console.WriteLine("Hello Debugelse");
#endif
        }
    }
}
复制代码

  #elif(=else if)和#else指令可以用在#if中,和C#中的if,else if,else含义相同。

  #if和#elif支持一组逻辑运算符"!","==","!="和"||",如果符号存在,则为true。

  #if DebugB && DebugA  //当Debug与DebugA同时存在才会执行

 

  #warning和#error

  当编译器遇到这两条指令时,会分别产生警告和错误。如果编译器遇到#warning指令,会显示该指令后的文本,之后继续编译。

  如果遇见#error指令,也会显示指令后面的文本。但会立刻退出编译,不会产生IL代码。(其实和编译器的警告和错误意义相同) 

复制代码
        static void Main(string[] args)
        {
#warning "All Right?"
            Console.WriteLine("Contine...");
//#error "All Right?"
//            Console.WriteLine("Contine...");
        }
复制代码

  下图为放开#error注释:

 

  #region和#endregion

  这两条指令,大家应该非常熟悉,作用就是代码缩进和指定该代码块的名称,使得代码可以更好的布局。详细用法可以参照报表系列的代码。

 

  #line

  这条指令很少用到。作用就是:如果代码在编译之前,要使用某些软件包改变输入的代码,就可以使用它。

  (其实就是更改代码的行号)

 

  #pragma warning

  此指令可启用或禁用某些警告。

  用法:  #pragma warning disable warning-list
            #pragma warning restore warning-list

  例子: 

复制代码
using System;

#pragma warning disable 414, 3021
[CLSCompliant(false)]
public class C
{
    int i = 1;
    static void Main()
    {
    }
}
#pragma warning restore 3021
[CLSCompliant(false)]  // CS3021
public class D
{
    int i = 1;
    public static void F()
    {
    }
}
复制代码

 

  #pragma checksum

  作用是生成源文件的校验和,以帮助调试 ASP.NET 页。

   用法:  #pragma checksum "filename" "{guid}" "checksum bytes"

              filename"               要求监视更改或更新的文件的名称。                               

              "{guid}"                文件的全局唯一标识符 (GUID)。                               

              "checksum_bytes"  十六进制数的字符串,表示校验和的字节。必须是偶数位的十六进制数。

                                           奇数位的十六进制数字会导致编译时警告,然后指令被忽略。            

    例子:

复制代码
class TestClass
{
    static int Main()
    {
        #pragma checksum "file.cs" "{3673e4ca-6098-4ec1-890f-8fceb2a794a2}" "{012345678AB}" // New checksum
    }
}
复制代码
  评论这张
 
阅读(32)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018