• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C#教程 > C#中的预处理器指令详解

C#中的预处理器指令详解

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了c#泛型详解,c#网站开发案例详解,c#关键字详解,c#三层架构详解,c#基础与案例开发详解等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

目录

1. #define 和 #undef
2. #if、#elif、#else 和#endif
3. #warning 和 #error
4. #region 和#endregion
5. #line
6. #pragma

  C#中有许多名为“预处理器指令”的命令。这些命令从来不会转化为可执行代码中的命令,但会影响编译过程的各个方面。

  例如,使用预处理器指令可以禁止编译器编译代码的某一部分。如果计划发布两个版本的代码,即基本版本和拥有更多功能的企业版本,就可以使用这些预处理器指令。在编译软件的基本版本时,使用预处理器指令可以禁止编译器编译与额外功能相关的代码。

  另外,在编写提供调试信息的代码时,也可以使用预处理器指令。实际上,在销售软件时,一般不希望编译这部分代码。

  预处理器指令的开头都有符号#。

  C++开发人员应知道,在C 和C++中预处理器指令非常重要,但是,在C#中,并没有那么多的预处理器指令,它们的使用也不太频繁。C#提供了其他机制来实现许多C++指令的功能,如定制特性。还要注意,C#并没有一个像C++那样的独立预处理器,所谓的预处理器指令实际上是由编译器处理的。

  尽管如此,C#仍保留了一些预处理器指令名称,因为这些命令会让人觉得就是预处理器。

  下面简要介绍预处理器指令的功能。

 
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
  这些指令告诉编译器是否要编译某个代码块。考虑下面的方法:

int DoSomeWork(double x)
{
  // do something
  #if DEBUG
  Console.WriteLine("x is " + x);
  #endif
}
</div>

  这段代码会像往常那样编译,但Console.WriteLine 命令包含在#if 子句内。

  这行代码只有在前面的#define 命令定义了符号DEBUG 后才执行。

  当编译器遇到#if 语句后,将先检查相关的符号是否存在,如果符号存在,就编译#if 子句中的代码。否则,编译器会忽略所有的代码,直到遇到匹配的#endif 指令为止。

  一般是在调试时定义符号DEBUG,把与调试相关的代码放在#if 子句中。在完成了调试后,就把#define 语句注释掉,所有的调试代码会奇迹般地消失,可执行文件也会变小,最终用户不会被这些调试信息弄糊涂(显然,要做更多的测试,确保代码在没有定义DEBUG 的情况下也能工作)。

  这项技术在C 和C++编程中十分常见,称为条件编译(conditional compilation)。

  #elif (=else if)和#else 指令可以用在#if 块中,其含义非常直观。也可以嵌套#if 块:

#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
</div>
 
与C++中的情况不同,使用#if 不是有条件地编译代码的唯一方式,C#还通过Conditional 特性提供了另一种机制。

#if 和#elif 还支持一组逻辑运算符“!”、“==”、“!=”和“||”。如果符号存在,就被认为是true,否则为false,例如:

#if W2K && (ENTERPRISE==false) // if W2K is defined but ENTERPRISE isn't
</div>

3. #warning 和 #error

  另两个非常有用的预处理器指令是#warning 和#error,当编译器遇到它们时,会分别产生警告或错误。如果编译器遇到#warning 指令,会给用户显示#warning 指令后面的文本,之后编译继续进行。如果编译器遇到#error 指令,就会给用户显示后面的文本,作为一条编译错误消息,然后会立即退出编译,不会生成IL 代码。

  使用这两条指令可以检查#define 语句是不是做错了什么事,使用#warning 语句可以提醒自己执行某个操作:

#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.*");
</div>

4. #region 和#endregion
  #region 和#endregion 指令用于把一段代码标记为有给定名称的一个块,如下所示。

#region Member Field Declarations
int x;
double d;
Currency balance;
#endregion
</div>

  这看起来似乎没有什么用,它不影响编译过程。这些指令的优点是它们可以被某些编辑器识别,包括Visual Studio .NET 编辑器。这些编辑器可以使用这些指令使代码在屏幕上更好地布局。

5. #line
  #line 指令可以用于改变编译器在警告和错误信息中显示的文件名和行号信息。这条指令用得并不多。

  如果编写代码时,在把代码发送给编译器前,要使用某些软件包改变输入的代码,就可以使用这个指令,因为这意味着编译器报告的行号或文件名与文件中的行号或编辑的文件名不匹配。

  #line 指令可以用于还原这种匹配。也可以使用语法#line default 把行号还原为默认的行号:

#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 default // restores default line numbering
</div>

6. #pragma
  #pragma 指令可以抑制或还原指定的编译警告。与命令行选项不同,#pragma 指令可以在类或方法级别执行,对抑制警告的内容和抑制的时间进行更精细的控制。

  下面的例子禁止“字段未使用”警告,然后在编译MyClass 类后还原该警告。

#pragma warning disable 169
public class MyClass
{
  int neverUsedField;
}
#pragma warning restore 169
</div>

感谢大家收看,谢谢亲们了。

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C#的泛型方法解析
  • C#给Excel添加水印实例详解
  • C#枚举类型和结构体详解
  • C#基础之泛型
  • C#调用Java方法实例详解
  • C#获取机器码的方法详解(机器名,CPU编号,硬盘编号,网卡mac等)
  • C#中数组Array,ArrayList,泛型List详细对比
  • C#泛型委托的用法实例分析
  • C#同步网络时间的方法实例详解
  • C#中的预处理器指令详解

相关文章

  • 2017-05-28c#固定长度的随机字符串例子
  • 2017-05-28使用MSScriptControl 在 C# 中读取json数据的方法
  • 2017-05-28C#中的 == 和equals()区别浅析
  • 2017-05-28C#开发教程之FTP上传下载功能详解
  • 2017-05-28C# 7.0 新特性1之基于Tuple的“多”返回值方法
  • 2017-05-28C#实现获取一年中是第几个星期的方法
  • 2017-05-28C#中接口(interface)的理解
  • 2017-05-28用C#把文件转换为XML的代码
  • 2017-05-28C# 常用协议实现模版及FixedSizeReceiveFilter示例(SuperSocket入门)
  • 2017-05-28C#多线程之Thread中Thread.IsAlive属性用法分析

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C#实现日期格式转换的公共方法类实例
    • C#泛型用法实例分析
    • C#自动生成漂亮的水晶效果头像的实现代码
    • c#访问this关键字和base关键字示例
    • C# 6.0的属性(Property)的语法与初始值详解
    • C#串口通信程序实例详解
    • C#限速下载网络文件的方法实例
    • c#循环中产生伪随机数
    • 基于c# 接口的实例详解
    • C# SESSION丢失问题的解决办法

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有