C# 预处理器指令(学习心得 24)

2023-11-11

预处理器指令:指导编译器在实际编译开始之前对信息进行预处理。

所有的预处理器指令都是以 # 开始。

在一行上,只有空白字符可以出现在预处理器指令之前。

预处理器指令不是语句,所以它们不以 分号(;)结束。

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

超级小白友好,讲解C#基础,每集5分钟轻松学习,拒绝从入门到放弃!

一、C# 预处理器指令列表

C# 中可用的预处理器指令:

预处理器指令 描述
#define 它用于定义一系列成为符号的字符。
#undef 它用于取消定义符号。
#if 它用于测试符号是否为真。
#else 它用于创建复合条件指令,与 #if 一起使用。
#elif 它用于创建复合条件指令。
#endif 指定一个条件指令的结束。
#line 它可以让您修改编译器的行数以及(可选地)输出错误和警告的文件名。
#error 它允许从代码的指定位置生成一个错误。
#warning 它允许从代码的指定位置生成一级警告。
#region 它可以让您在使用 Visual Studio Code Editor 的大纲特性时,指定一个可展开或折叠的代码块。
#endregion 它标识着 #region 块的结束。

1.1 #define 预处理器

#define 预处理器指令:创建符号常量。

这样,通过使用符号作为传递给 #if 指令的表达式,表达式将返回 true。

语法:

#define symbol

例:

#define PI
using System;
namespace PreprocessorDAppl
{
   class Program
   {
      static void Main(string[] args)
      {
         #if (PI)
            Console.WriteLine("PI is defined");
         #else
            Console.WriteLine("PI is not defined");
         #endif
         Console.ReadKey();
      }
   }
}

运行结果:

PI is defined

1.2 条件指令

使用 #if 指令来创建一个条件指令。

条件指令用于测试符号是否为真。

如果为真,编译器会执行 #if 和下一个指令之间的代码。

语法:

#if symbol [operator symbol]...

symbol 是要测试的符号名称。您也可以使用 true 和 false,或在符号前放置否定运算符。

常见运算符有:

  • == (等于)
  • != (不等于)
  • && (与)
  • || (或)

一个以 #if 指令开始的条件指令,必须显示地以一个 #endif 指令终止。

例:

#define DEBUG
#define VC_V10
using System;
public class TestClass
{
   public static void Main()
   {

      #if (DEBUG && !VC_V10)
         Console.WriteLine("DEBUG is defined");
      #elif (!DEBUG && VC_V10)
         Console.WriteLine("VC_V10 is defined");
      #elif (DEBUG && VC_V10)
         Console.WriteLine("DEBUG and VC_V10 are defined");
      #else
         Console.WriteLine("DEBUG and VC_V10 are not defined");
      #endif
      Console.ReadKey();
   }
}

运行结果:

DEBUG and VC_V10 are defined

二、预处理器指令的用途理解

在程序调试和运行上有重要的作用。

比如预处理器指令可以禁止编译器编译代码的某一部分,如果计划发布两个版本的代码,即基本版本和有更多功能的企业版本,就可以使用这些预处理器指令来控制。

在编译软件的基本版本时,使用预处理器指令还可以禁止编译器编译于额外功能相关的代码。

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

总的来说和普通的控制语句(if等)功能类似,方便在于预处理器指令包含的未执行部分是不需要编译的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# 预处理器指令(学习心得 24) 的相关文章

  • 切换图片框可见性 C#

    为什么图片框控件的可见性属性在这里不起作用 我最初将它们设置为 false 以便在屏幕加载时它们不可见 但后来我想切换这个 我已完成以下操作 但似乎不起作用 这是一个 Windows 窗体应用程序 private void Action w
  • 如何在 Windows 窗体中运行屏幕保护程序作为其背景?

    如何在 Windows 窗体中运行屏幕保护程序作为其背景 用户还可以在屏幕保护程序运行时与表单控件进行交互 为什么这个 我们有一个案例 需要在用户时运行 Windows Bubbles 屏幕保护程序 可以继续与表单控件交互吗 您可以使用以下
  • F10键没被抓住

    I have a Windows Form and there overriden ProcessCmdKey However this works with all of the F Keys except for F10 I am tr
  • 导出到 CSV 时 Gridview 出现空行

    这个问题是由进一步讨论引发的这个问题 https stackoverflow com questions 6674555 export gridview data into csv file 6674589 noredirect 1 com
  • 为什么重载方法在 ref 仅符合 CLS 方面有所不同

    公共语言规范对方法重载非常严格 仅允许根据其参数的数量和类型来重载方法 如果是泛型方法 则根据其泛型参数的数量进行重载 根据 csc 为什么此代码符合 CLS 无 CS3006 警告 using System assembly CLSCom
  • 数据损坏 C++ 和 Python 之间的管道

    我正在编写一些代码 从 Python 获取二进制数据 将其通过管道传输到 C 对数据进行一些处理 在本例中计算互信息度量 然后将结果通过管道传输回 Python 在测试时 我发现如果我发送的数据是一组尺寸小于 1500 X 1500 的 2
  • 从包含大量文件的目录中检索文件

    我的目录包含近 14 000 000 个 wav 格式的音频样本 所有普通存储 没有子目录 我想循环浏览文件 但是当我使用DirectoryInfo GetFiles 在该文件夹上 整个应用程序冻结了几分钟 可以用另一种方式完成吗 也许读取
  • `cosf`、`sinf` 等不在 `std` 中 [重复]

    这个问题在这里已经有答案了 根据这里的讨论 我有报告了一个错误 https bugs launchpad net ubuntu source gcc 8 bug 1831385给 Ubuntu 开发者 编译以下示例 C 程序时 includ
  • realloc():重新分配为 char * 上的 strcat 腾出空间时下一个大小无效 [重复]

    这个问题在这里已经有答案了 我在以下代码中收到无效内存错误 printf s n FINE 5 printf s LENGTH IS d n FINE 6 strlen buffer char realloc buffer strlen b
  • 理解 C++11 中的 std::atomic::compare_exchange_weak()

    bool compare exchange weak T expected T val compare exchange weak 是 C 11 中提供的比较交换原语之一 它是weak即使对象的值等于 它也会返回 falseexpected
  • 有没有更好的方法来获取每个项目与谓词匹配的子序列?

    假设我有一个 IEnumerable 例如 2 1 42 0 9 6 5 3 8 我需要获得与谓词匹配的项目的 运行 例如 如果我的谓词是 bool isSmallerThanSix int number 我想得到以下输出 2 1 0 5
  • 如何将 CSV 文件读入 .NET 数据表

    如何将 CSV 文件加载到System Data DataTable 根据CSV文件创建数据表 常规 ADO net 功能是否允许这样做 我一直在使用OleDb提供者 但是 如果您正在读取具有数值的行 但希望将它们视为文本 则会出现问题 但
  • 是否有任何不使用公共虚拟方法的正当理由? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 是否有任何不使用公共虚拟方法的正当理由 我在某处读到我们应该避免使用公共虚拟方法 但我想向专家确认这是否是有效的声明 对于良好且稳定的 API
  • 为什么 C# 接口名称前面加上“I”

    这种命名约定背后的基本原理是什么 我没有看到任何好处 额外的前缀只会污染 API 我的想法与康拉德一致response https stackoverflow com a 222502 9898与此相关的question https sta
  • 如何强制执行特定的 UserControl 设计

    我正在编写一个基本用户控件 它将由一堆其他用户控件继承 我需要对所有这些后代控件强制执行某种设计 例如 顶部必须有几个按钮以及一个或两个标签 后代用户控件区域的其余部分可以自由放置任何内容 最初 我认为我可以将一个面板放到 Base Use
  • 检测 SignalR Hub 客户端立即断开连接

    SignalR Hub OnDisconnected 何时在服务器端引发 对于崩溃或关闭而不调用Stop method 我正在使用 SignalR NET 客户端进行测试 而不是 javascript 客户端 如果我打电话给Stop客户端上
  • 通过 cmake 链接作为外部项目包含的 opencv 库[重复]

    这个问题在这里已经有答案了 我对 cmake 比较陌生 经过几天的努力无法弄清楚以下事情 我有一个依赖于 opencv 的项目 它本身就是一个 cmake 项目 我想静态链接 opencv 库 我正在做的是我的项目中有一份 opencv 源
  • 将文本从文本文件添加到 PDF 文件[重复]

    这个问题在这里已经有答案了 这是我的代码 using FileStream msReport new FileStream pdfPath FileMode Create step 1 using Document pdfDoc new D
  • 如何从函数返回矩阵(二维数组)? (C)

    我创建了一个生成宾果板的函数 我想返回宾果板 正如我没想到的那样 它不起作用 这是函数 int generateBoard int board N M i j fillNum Boolean exists True initilize se
  • 如何确定给定方法可以抛出哪些异常?

    我的问题和这个真的一样 找出 C 中方法可能抛出的异常 https stackoverflow com questions 264747 finding out what exceptions a method might throw in

随机推荐

  • vscode 做php开发环境配置

    vscode 中安装插件 php server php debug php intellisense Code Runner Composer PHP DocBlocker 在https xdebug org download php 下载
  • Vue工程化开发及vue/cli脚手架

    1 安装 vue cli 安装 Vue CLI 1 安装nodejs https nodejs org en 验证 node v version 使用npm 2 安装vue cli npm install g vue cli 验证 vue
  • pom的dependencyManagement管理下的dependency依赖爆红

    问题描述 新创建maven项目后 在父工程中dependencyManagement时 会报红线错误 刷新后还是报红 例如 mysql version 爆红
  • Python-Unicode

    额 for i in range 10000 print chr i end if i 50 0 print Users star PycharmProjects qq2 venv bin python Users star Pycharm
  • 二分查找题目汇总

    1 Search In Rotated Array 2 Search In Rotated Array if A begin A mid begin skip 就可以了 3 Search For a Range 1 标准二分 左右扩展 最坏
  • Ubuntu22.04 LTS 显卡相关命令

    第一部分查看驱显卡信息 一 查看显卡型号 i表示不区分大小写 lspci grep i nvidia 必须安装好nvidia驱动 nvidia smi L 二 查看显卡驱动版本 cat proc driver nvidia version
  • 支付宝支付接口(即时到账交易接口)

    create direct pay by user 官方参数API文档地址 https doc open alipay com docs doc htm spm a219a 7629140 0 0 dsNjYY treeId 108 art
  • ajax中如何隐藏列,【JS】在chrome等浏览器中,如何隐藏掉ajax请求,使其不会显示在console中...

    由于项目的保密性需要 需要隐藏掉ajax请求接口的地址 请问各位都是怎么做的 回答 纯后端渲染 不用ajax 后端的安全性怎么可能让前端来保证 你最多只能签名一下参数 可以尝试使用中转服务器 假设服务器 B 需要保密 你可以转而请求 A 服
  • Java类加载器

    目录 0 知识储备 JVM内存分区 双亲委派机制 1 Java类加载机制 1 1核心类加载器启动原理 类加载的含义 类加载过程 1 类的加载 2 类的连接 3 初始化 1 2类加载的双亲委派机制 2 类加载器的类型 3 自定义类加载器的实现
  • eclipse svn 忽略 target/.project /.classpath /.settings等 目录

    问题描述 用eclipse同步项目时 会出现target project classpath settings等与代码无关的文件 介绍两种办法 推荐第二种 方法一 在新建项目的时候 在第一次commit 到 SVN 之前 先在项目的根目录设
  • L1,L2,L3 Cache缓存原理

    一 介绍 CPU缓存 Cache Memory 也被称为Cache 是存储器子系统的组成部分 存放着程序经常使用的指令和数据 从广义的角度上看 Cache是快设备为了缓解访问慢设备延时的预留的Buffer 从而可以在掩盖访问延时的同时 尽可
  • qt 中报 error: No rule to make target 这个错误的就解决方法

    最近在用qt设计数据库课设的前端界面 在做好的界面更改资源文件时qt给报了这个错误 error No rule to make target one OneDrive 01 png needed by debug qrc res cpp 我
  • LDAP 常用名词

    LDAP目录结构的最顶部就是根 也就是所谓的基准 DN DN通常有一下三种格式为 DN domain name 域名 域名系统 域名服务器 假定我在一家电子商务公司工作 这家公司在internet上的名字为foobar com o foob
  • web前端统计埋点分离方案

    前言 最近一直在思考一个吸引人的标题对一篇文章的阅读到底影响有多大 所以这篇文章取了一个比较大的标题 内容是炒冷饭 主要是再介绍一下之前在业务里遇见关于统计埋点的问题 以及我的解决方案 Tagmanager Tagmanager tagma
  • selenium解决下拉表单和浏览器下拉进度条问题的问题

    1 有的时候使用selenium自动化模块时会遇到下拉表单的问题 name如何解决这个问题呢 Selenium专门提供了Select类来处理下拉框 导入 Select 类 from selenium webdriver support ui
  • 网站发布一般步骤以及解决方法

    1 在D盘 随便一个地方 新建文件夹 2 在vs项目中点击发布弹出对话框 3 配置文件选择自定义 4 下一步 Publish method 选择file system 5 target location选择第一步创建的文件夹 6 下一步 f
  • 《软件测试的艺术》

    1 每当测试一个程序时 应当想到要为程序增加一些价值 通过测试来增加程序的价值 是指测试提高了程序的可靠性或质量 提高了程序的可靠性 是指找出并最终修改了程序的错误 因此 不要只是为了证明程序能够正确运行而去测试程序 相反 应该一开始就假设
  • datetime数据类型在页面上的显示不完全

    下面两个代码全包含在script标签中 function fmtDate sDate var dt new Date sDate var y dt getFullYear var m dt getMonth 1 var d dt getDa
  • 用VS2015开发Linux程序

    1 开发工具 VS2015Update3 Visual C for Linux Development VC Linux exe 下载链接 介绍 VMware 虚拟机软件 ubuntu 16 04 desktop amd64 iso Lin
  • C# 预处理器指令(学习心得 24)

    预处理器指令 指导编译器在实际编译开始之前对信息进行预处理 所有的预处理器指令都是以 开始 在一行上 只有空白字符可以出现在预处理器指令之前 预处理器指令不是语句 所以它们不以 分号 结束 一个预处理器指令必须是该行上的唯一指令 超级小白友