当前位置: 首页 > news >正文

C#预处理器指令

C#预处理器指令是在编译时调用的。

预处理器指令(preprocessor directive)告诉C#编译器要编译哪些代码,并指出如何处理特定的错误和警告。

C#预处理器指令还可以告诉C#编辑器有关代码组织的信息。

1. 定义符号和取消符号定义的预处理指令#define 和 #undef

预处理指令都以#号开头并位于行首,前面可以出现空格符。

#define DEBUG
#define ISSAY
上面的语句定义了一个预编译的符号,他的作用域是他所处的整个文件,定义符号的语句必须出现在所有代码之前, 否则编译的时候会出现一个异常: 不能在文件的第一个标记之后,定义或取消定义预处理器符号 。我们也可以使用#undef来取消一个符号的定义,先来看个例子。

复制代码
#define DEBUG
#undef DEBUG
#define ISSAY 

using System;   
namespace JustDoIt   
{   
class Program   
     {   
static void Main(string[] args)   
         {
             #if DEBUG 
             Console.Write("debug.");
             #endif
             #if ISSAY 
             Console.Write("hello.");
         #else 
             Console.Write("you can say nothing.");
             #endif 

         Console.ReadLine();   
         }   
     }   
}   
//输出:hello
复制代码
从上面的代码我们可以看到第一行定义了一个符号DEBUG,紧接着第二行取消了这个符号的定义,也就是相当于没有定义一样,所以程序运行的时候不会执行Console.Write("debug.")这个语句。第三行定义了ISSAY符号,所以程序输出了“hello”,如果我们把他注释了或者是删除了,那么程序会输出“you can say nothing“。我们可以初步看到通过定义预编译的符号,可以控制编译器选择性地编译代码。上面的代码中还有#if和#endif这样的符号,这些是条件编译指令。

2. 条件编译指令

条件编译指令有4个,除了我们从第一个示例看到的#if、#else、#endif之外,还有一个#elif。我们对这些指令应该有是曾相识的感觉,他们跟我们平时编写代码的时候试用的条件语句是一样的,条件语句是用来控制程序流的,而这些条件编译指令是用来控制编译器选择性地编译代码的。

一条#if语句可以有0条或多条#elif语句,也可以有0条或一条#else 语句,但必须包括一条#endif语句必须有,否则会出现语法错误。

3. #region和#endregion

这两个符号平时我们肯定用的很多了,就是把一些相关的代码折叠到一起,这样对我们在一个文件中编写较长的代码非常有用,我们可以把一组相关的代码用#region和#endregion组织在一起并且可以在#region后面加上说明的文字,当这组代码被折叠起来的时候,我们可以看到#region后面的说明文字。

 

 

MSDN上的 C# 预处理器指令 介绍

Visual Studio 2013

MSDN

本节包含有关以下 C# 预处理器指令的信息。

#if

#else

#elif

#endif

# define

#undef

#warning

#error

#line

#region

#endregion

#pragma

#pragma warning

#pragma checksum

请参见各个主题有关更多信息和示例。

虽然编译器没有单独的预处理器,本节中介绍的处理指令,就象一个。 它们在条件编译用于帮助。 与 C 和 C++ 指令不同,不能使用这些指令创建宏。

预处理器指令必须是行上的唯一指令。

好文要顶 关注我 

  

转载于:https://www.cnblogs.com/profession/p/8966614.html

相关文章:

  • find中的-exec参数
  • 再次解决 尝试加载 Oracle 客户端库时引发 BadImageFormatException
  • 学习笔记——悬线法
  • 8.dockerfile之CMD指令
  • Mysql Programming CS 155P笔记(七) Dynamic SQL
  • JMS学习六(ActiveMQ消息传送模型)
  • linux常用命令:find 命令参数详解
  • MySQL Route负载均衡与读写分离Docker环境使用
  • linux 下 mysql-5.5.8 安装
  • 网络流24题~飞行员配对方案问题
  • vs code 插件收集
  • 编程语言的介绍
  • java并发编程——通过ReentrantLock,Condition实现银行存取款
  • Qt QListWidget实现图片缩略图列表
  • 数字证书了解
  • 「译」Node.js Streams 基础
  • CAP理论的例子讲解
  • crontab执行失败的多种原因
  • ES6核心特性
  • export和import的用法总结
  • JavaScript异步流程控制的前世今生
  • Java基本数据类型之Number
  • js ES6 求数组的交集,并集,还有差集
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • SpriteKit 技巧之添加背景图片
  • storm drpc实例
  • Terraform入门 - 1. 安装Terraform
  • 编写符合Python风格的对象
  • 个人博客开发系列:评论功能之GitHub账号OAuth授权
  • 前端js -- this指向总结。
  • 推荐一个React的管理后台框架
  • 应用生命周期终极 DevOps 工具包
  • 用quicker-worker.js轻松跑一个大数据遍历
  • Python 之网络式编程
  • ​linux启动进程的方式
  • # 安徽锐锋科技IDMS系统简介
  • #Spring-boot高级
  • (0)Nginx 功能特性
  • (11)工业界推荐系统-小红书推荐场景及内部实践【粗排三塔模型】
  • (附源码)计算机毕业设计ssm-Java网名推荐系统
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (强烈推荐)移动端音视频从零到上手(上)
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • (实战篇)如何缓存数据
  • (五)IO流之ByteArrayInput/OutputStream
  • (转) RFS+AutoItLibrary测试web对话框
  • (转)EXC_BREAKPOINT僵尸错误
  • (转)scrum常见工具列表
  • (转)大型网站的系统架构
  • (转)使用VMware vSphere标准交换机设置网络连接
  • ./configure,make,make install的作用
  • .NET / MSBuild 扩展编译时什么时候用 BeforeTargets / AfterTargets 什么时候用 DependsOnTargets?
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地定义和使用弱事件
  • .vue文件怎么使用_vue调试工具vue-devtools的安装
  • // an array of int