新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> 本版讨论.NET,C#,ASP,VB技术
    [返回] 计算机科学论坛计算机技术与应用『 Dot NET,C#,ASP,VB 』 → 一些C#预处理器指令 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 6803 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: 一些C#预处理器指令 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     卷积内核 帅哥哟,离线,有人找我吗?
      
      
      威望:8
      头衔:总统
      等级:博士二年级(版主)
      文章:3942
      积分:27590
      门派:XML.ORG.CN
      注册:2004/7/21

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给卷积内核发送一个短消息 把卷积内核加入好友 查看卷积内核的个人资料 搜索卷积内核在『 Dot NET,C#,ASP,VB 』的所有贴子 访问卷积内核的主页 引用回复这个贴子 回复这个贴子 查看卷积内核的博客楼主
    发贴心情 一些C#预处理器指令


    像C语言一样,C#有一些预处理器指令的命令。例如,#if#end if,#define等,所谓这些命令是指不会转化为可执行代码中的一些命令,只是在编译的过程中起作用。
    下面简要介绍一下:
    1 、#define和 #undef
    #define的用法如下所示:
    #define DEBUG
      它告诉编译器存在给定名称的符号,在本例中是DEBUG。这有点类似于声明一个变量,但这个变量并没有真正的值,只是存在而已。这个符号不是实际代码的一部分,而只在编译器编译代码时存在。在C#代码中它没有任何意义。
    #undef正好相反-- 删除符号的定义:
      #undef DEBUG
      如果符号不存在,#undef就没有任何作用。同样,如果符号已经存在,#define也不起作用。必须把#define和#undef命令放在C#源代码的开头,在声明要编译的任何对象的代码之前。#define本身并没有什么用,但与其他预处理器指令(特别是#if)结合使用时,它的功能就非常强大了。
      注意:
      这里应注意一般C#语法的一些变化。预处理器指令不用分号结束,一般一行上只有一个命令。这是因为对于预处理器指令,C#不再要求命令用分号结束。如果它遇到一个预处理器指令,就会假定下一个命令在下一行上。
    2、#if, #elif, #else和#endif
      这些指令告诉编译器是否要编译某个代码块。考虑下面的方法:

    [csharp] int DoSomeWork(double x)
    {
       // do something
       #if DEBUG  
          Console.WriteLine("x is " + x);
       #endif  
    }
       int DoSomeWork(double x)
       {
          // do something
          #if DEBUG
             Console.WriteLine("x is " + x);
          #endif
       }
      这段代码会像往常那样编译,但Console.WriteLine命令包含在#if子句内。这行代码只有在前面的#define命令定义了符号DEBUG后才执行。当编译器遇到#if语句后,将先检查相关的符号是否存在,如果符号存在,就编译#if块中的代码。否则,编译器会忽略所有的代码,直到遇到匹配的#endif指令为止。一般是在调试时定义符号DEBUG,把与调试相关的代码放在#if子句中。
      在完成了调试后,就把#define语句注释掉,所有的调试代码会奇迹般地消失,可执行文件也会变小,最终用户不会被这些调试信息弄糊涂(显然,要做更多的测试,确保代码在没有定义DEBUG的情况下也能工作)。
    #elif (=else if)和#else指令可以用在#if块中,其含义非常直观。也可以嵌套#if块:

    [csharp]
    #define ENTERPRISE
    #define W2K  

    // further on in the file

    #if  ENTERPRISE  
       // do something
       #if W2K  
          // some code that is only relevant to enterprise  
          // edition running on W2K
       #endif
    #elif PROFESSIONAL  
       // do something else
    #else  
       // code for the leaner version
    #endif
    #define ENTERPRISE
    #define W2K

    // further on in the file

    #if  ENTERPRISE
       // do something
       #if W2K
          // some code that is only relevant to enterprise
          // edition running on W2K
       #endif
    #elif PROFESSIONAL
       // do something else
    #else
       // code for the leaner version
    #endif
      #if和 #elif还支持一组逻辑运算符!、==、!=和 ||。如果符号存在,就被认为是true,否则为false。
    3、#warning和 # error
      另外两个非常有用的预处理器指令是#warning和#error,当编译器遇到它们时,会分别产生警告或错误。如果编译器遇到#warning指令,会给用户显示#warning指令后面的文本,之后编译继续进行。如果编译器遇到#error指令,就会给用户显示后面的文本,作为一个编译错误信息,然后会立即退出编译,不会生成IL代码。使用这两个指令可以检查#define语句是不是做错了什么事,使用#warning语句可以让自己想起做过什么事:

    [csharp]
    #if DEBUG && RELEASE
       #error "You've defined DEBUG and RELEASE simultaneously! "
    #endif

    #warning "Don't forget to remove this line before the boss tests the code! "  
       Console.WriteLine("*I hate this job*");
    #if DEBUG && RELEASE
       #error "You've defined DEBUG and RELEASE simultaneously! "
    #endif

    #warning "Don't forget to remove this line before the boss tests the code! "
       Console.WriteLine("*I hate this job*");
    4、  #region和#endregion
      #region和 #endregion指令用于把一段代码标记为有给定名称的一个块,如下所示。

    [csharp]
    #region   

    Member Field Declarationsint x;
    double d;
    Currency balance;

    #endregion  
    #region

    Member Field Declarationsint x;
    double d;
    Currency balance;

    #endregion
      这看起来似乎没有什么用,它不影响编译过程。这些指令的优点是它们可以被某些编辑器识别,包括Visual Studio编辑器。这些编辑器可以使用这些指令使代码在屏幕上更好地布局。
    5 、 #line
      #line指令可以用于改变编译器在警告和错误信息中显示的文件名和行号信息。这个指令用得并不多。如果编写代码时,在把代码发送给编译器前,要使用某些软件包改变键入的代码,就可以使用这个指令,因为这意味着编译器报告的行号或文件名与文件中的行号或编辑的文件名不匹配。#line指令可以用于恢复这种匹配。也可以使用语法#line default把行号恢复为默认的行号:

    [csharp]
    #line 164 "Core.cs"   // we happen to know this is line 164 in the file  
                       // Core.cs, before the intermediate  
                       // package mangles it.  

    // later on
    #line 164 "Core.cs"   // we happen to know this is line 164 in the file
                       // Core.cs, before the intermediate
                       // package mangles it.

    // later on
    6、  #pragma
      #pragma指令可以抑制或恢复指定的编译警告。与命令行选项不同,#pragma指令可以在类或方法上执行,对抑制警告的内容和抑制的时间进行更精细的控制。下面的例子禁止字段使用警告,然后在编译MyClass类后恢复该警告。

    [csharp]
    #pragma warning disable 169  
    public class MyClass  
    {
      int neverUsedField;
    }
    #pragma warning restore 169


       收藏   分享  
    顶(0)
      




    ----------------------------------------------
    事业是国家的,荣誉是单位的,成绩是领导的,工资是老婆的,财产是孩子的,错误是自己的。

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2014/7/11 11:07:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 Dot NET,C#,ASP,VB 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/4/16 9:29:11

    本主题贴数1,分页: [1]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    8,484.375ms