C#学习12——预处理

一、预处理指令:

解释:是在编译前由预处理器执行的命令,用于控制编译过程。这些命令以 # 开头,每行只能有一个预处理指令,且不能包含在方法或类中。

个人理解:就是游戏里面的备战阶段(不同对局,不同选英雄。。。)

1.#define 定义字符和 #undef取消定义字符
#define TEST
#undef TEST  // 取消定义(删掉则输出"TEST 已定义")#if TESTConsole.WriteLine("TEST 已定义");
#elseConsole.WriteLine("TEST 未定义");  // 输出此行"TEST 未定义"
#endif

#define 宏常量与内置的 const 常量区别:
特性            #define 宏常量                                    const 常量
定义方式    定义条件符号,在编译前替换文本       语言关键字,声明为不可修改的变量
作用域       无作用域限制                                        遵循变量作用域(块、类作用域等)
类型安全    无类型检查,可能导致意外行为          有类型声明,编译器会进行类型检查
内存占用    无独立内存,直接替换为文本              可能占用内存(取决于编译器优化)
调试支持    调试时不可见(已替换为文本)          调试时可见(有独立符号)
灵活性       可定义复杂表达式或代码片段               仅能定义简单值

2.条件编译指令#if#else#elif#endif
#define DEBUG  // 定义一个符号(通常在项目属性中设置)#if !DEBUGConsole.WriteLine("不是DEBUG模式");//输出这一行
#elif DEBUGConsole.WriteLine("DEBUG模式");
#elseConsole.WriteLine("其他模式");
#endif

配套使用规则

这些指令必须成对出现,形成一个完整的条件编译块:

  • #if:开始条件编译块,检查符号是否定义。
  • #elif(可选):提供额外的条件分支。
  • #else(可选):定义默认分支(当所有条件都不满足时)。
  • #endif:结束条件编译块。
3.#error错误和警告指令(可嵌套)
#if OLD_VERSION#error 此代码需要更新到新版本
#elseConsole.WriteLine("代码正常运行");
#endif
4.#warning    生成编译器警告信息
#warning 此方法已过时,需要重构
5.#region:标记一个可折叠代码块的开始。#endregion:标记一个可折叠代码块的结束。
#region PropertiesConsole.WriteLine("这一段是代码块1");Console.WriteLine("这一段是代码块1");Console.WriteLine("这一段是代码块1");
#endregion#region MethodsConsole.WriteLine("这一段是代码块2");Console.WriteLine("这一段是代码块2");Console.WriteLine("这一段是代码块2");
#endregion
6.#line显式指定编译器在生成错误或警告时报告的行号和文件名

#line 数字 "文件名"

#line default恢复编译器使用实际的行号和文件名。

#line hidden隐藏代码行(通常用于编译器内部实现,如生成的状态机代码)。

#line 10 "Template.tt"public void GeneratedMethod() {Console.WriteLine("Hello from generated code!");}
#line default
7.#pragma    用于给编译器发送特殊指令,例如禁用或恢复特定的警告。
#pragma warning disable CS0168  // 禁用“变量未使用”的警告
int unusedVariable;    // 不会触发CS0168警告
#pragma warning restore CS0168  // 恢复警告
int unusedVariable1;    // 会触发CS0168警告

拓展:

#pragma checksum  :校验

#pragma optimize:控制代码优化(如 #pragma optimize "g", 启用尾调用优化)。

#pragma pack:控制结构体的内存对齐(在C/C++中更常见,C#中较少使用)。

8.nullable    控制可空性上下文和注释,允许启用或禁用对可空引用类型的编译器检查。

string? nullableString = null; // 不会发出警告,默认启用可空注释
#nullable disable annotations
string? nullableString1 = null;//警告,因为可空注释已禁用
Console.WriteLine(nullableString.Length);//警告,出现空引用
#nullable disable
// 潜在的运行时错误
Console.WriteLine(nullableString1.Length);//不会发出警告,因为可空注释和警告都已禁用#nullable enable
string anotherString = null; // 警告,空文本
Console.WriteLine(anotherString.Length); // 警告,因为可空注释和警告都启用

二、为什么要用预处理命令?

1.为什么要用这个?
1)不同环境编译不同代码(调试发布模式Debug,跨平台代码Windows,Linux,IOS)
2)快速定位:
        a.标记暂时跳过的功能。
        b.提醒团队成员完成关键代码
3)功能开关
#define NEW_UI
class Program {
    static void Main() {
        #if NEW_UI
            ShowNewUI();
        #else
            ShowOldUI();
        #endif
    }
}
以 # 开始,不是语句,不以分号 ; 结束
4)提高可读性(用 #region 和 #endregion 折叠代码块,提升可读性。)

5) 灵活调试(#warning 和 #error 在编译时生成提示或错误)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/pingmian/84117.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开疆智能Profinet转Profibus网关连接CMDF5-8ADe分布式IO配置案例

本案例是客户通过开疆智能研发的Profinet转Profibus网关将PLC的Profinet协议数据转换成IO使用的Profibus协议,操作步骤如下。 配置过程: Profinet一侧设置 1. 打开西门子组态软件进行组态,导入网关在Profinet一侧的GSD文件。 2. 新建项目并…

(三)Linux性能优化-CPU-CPU 使用率

CPU使用率 user(通常缩写为 us),代表用户态 CPU 时间。注意,它不包括下面的 nice 时间,但包括了 guest 时间。nice(通常缩写为 ni),代表低优先级用户态 CPU 时间,也就是进…

Digital IC Design Flow

Flow介绍 1.设计规格 架构师根据市场需求制作算法模型(Algorithm emulation)及芯片架构(Chip architecture),确定芯片设计规格书(Chip design specification) 原型验证 原型验证(Prototype Validation)通常位于产品开发流程的前期阶段,主要是在设计和开发的初步阶…

算法打卡第18天

从中序与后序遍历序列构造二叉树 (力扣106题) 给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。 示例 1: 输入:inorder [9,3,15,20,7…

LangChain工具集成实战:构建智能问答系统完整指南

导读:在人工智能快速发展的今天,如何构建一个既能理解自然语言又能调用外部工具的智能问答系统,成为许多开发者面临的核心挑战。本文将为您提供一套完整的解决方案,从LangChain内置工具包的基础架构到复杂系统的工程实践。 文章深…

P3156 【深基15.例1】询问学号

P3156 【深基15.例1】询问学号 - 洛谷 数据结构-线性表 #include<bits/stdc.h> using namespace std; int n,m,a[2000005]; int main(){cin>>n>>m;for(int i1;i<n;i)cin>>a[i];//使用数组模拟线性表while(m--){int k;cin>>k;cout<<a[…

衡量嵌入向量的相似性的方法

衡量嵌入向量的相似性的方法 一、常见相似性计算方法对比 方法核心原理公式优点缺点适用场景余弦相似度计算向量夹角的余弦值,衡量方向相似性,与向量长度无关。$\text{cos}\theta = \frac{\mathbf{a} \cdot \mathbf{b}}{\mathbf{a}\mathbf{b}欧氏距离计算向量空间中的直线距离…

小番茄C盘清理:专业高效的电脑磁盘清理工具

在使用电脑的过程中&#xff0c;我们常常会遇到系统盘空间不足、磁盘碎片过多、垃圾文件堆积等问题&#xff0c;这些问题不仅会导致电脑运行缓慢&#xff0c;还可能引发系统崩溃。为了解决这些问题&#xff0c;小番茄C盘清理应运而生。它是一款专业的C盘清理软件&#xff0c;能…

【版本控制】Git 和 GitHub 入门教程

目录 0 引言1 Git与GitHub的诞生1.1 Git&#xff1a;Linus的“两周奇迹”&#xff0c;拯救Linux内核1.2 GitHub&#xff1a;为Git插上协作的翅膀1.3 协同进化&#xff1a;从工具到生态的质变1.4 关键历程时间轴&#xff08;2005–2008&#xff09; 2 Git与GitHub入门指南2.1 Gi…

Dify源码教程:账户和密码传递分析

概述 Dify系统中账户创建过程中的密码处理是Web应用安全的重要环节。本教程详细分析了从前端表单到后端存储的完整流程&#xff0c;展示了Dify如何安全地处理用户凭据。 前端部分 在 dify/web/app/install/installForm.tsx 文件中&#xff0c;当用户填写完表单并点击安装按钮…

window查看SVN账号密码

背景 公司的SVN地址发生迁移&#xff0c;想迁移一下本地SVN地址&#xff0c;后来发现SVN账号密码忘记了。写此文章纯记录。 迁移SVN地址&#xff1a; 找到svn目录点击relocate&#xff0c;输入新的svn地址&#xff0c;如需输入账号密码&#xff0c;输入账号密码即完成svn地址…

Read View在MVCC里如何工作

Read View的结构 Read View中有四个重要的字段&#xff1a; m_ids&#xff1a;创建 Read View 时&#xff0c;数据库中启动但未提交的「活跃事务」的事务 id 列表 。min_trx_id&#xff1a;创建 Read View 时&#xff0c;「活跃事务」中事务 id 最小的值&#xff0c;即 m_ids …

如何在mac上安装podman

安装 Podman 在 macOS 上 在 macOS 上安装 Podman 需要使用 Podman 的桌面客户端工具 Podman Desktop 或通过 Homebrew 安装命令行工具。 使用 Homebrew 安装 Podman&#xff1a; (base) ninjamacninjamacdeMacBook-Air shell % brew install podman > Auto-updating Hom…

QGraphicsView中鼠标点击与移动事件传递给MainWindow

在Qt图形应用程序开发中,QGraphicsView和QGraphicsScene框架提供了强大的2D图形显示功能。然而,当我们需要在主窗口(MainWindow)中处理这些视图中的鼠标事件。 问题背景 在典型的Qt图形应用程序架构中: MainWindow └── QGraphicsView└── QGraphicsScene└── QGra…

Spring Boot 缓存注解详解:@Cacheable、@CachePut、@CacheEvict(超详细实战版)

&#x1f4a1; 前言 在高并发、高性能的系统开发中&#xff0c;缓存是提升接口响应速度和降低数据库压力的重要手段。Spring Boot 提供了强大的缓存抽象层 —— spring-context-support&#xff0c;并结合 JSR-107 标准&#xff0c;提供了多个缓存注解&#xff0c;如&#xff…

vue中ref的详解以及react的ref对比

文章目录 1. ref是什么2. ref的使用3. ref的特性4. 使用场景5. 注意事项6. 与 React 的对比7. 动态 ref8. 函数式组件中的 ref9. 组合式 API 中的 ref10. 总结 1. ref是什么 ref 被用来给元素或子组件注册引用信息。引用信息将会注册在父组件的 $refs 对象上。可以通过实例对象…

通过ca证书的方式设置允许远程访问Docker服务

设置允许远程访问Docker服务 使用场景 环境 系统&#xff1a;anolis7.9 修改Docker服务配置&#xff0c;配置安全证书 生成ca证书到/etc/docker目录中&#xff0c;后续会要用到 #该步骤需要设置密码&#xff0c;后面步骤会要用到&#xff0c;此处设置密码为123456 openss…

Qt Quick Layout功能及架构

Qt Quick Layouts 是 Qt Quick 中用于管理用户界面布局的模块&#xff0c;在 Qt 6.0 中继续提供强大的布局管理功能。 一、主要功能 主要布局类型 RowLayout - 水平排列项目 ColumnLayout - 垂直排列项目 GridLayout - 网格排列项目 StackLayout - 堆叠项目&#xff08;一…

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?

Golang 面试经典题&#xff1a;map 的 key 可以是什么类型&#xff1f;哪些不可以&#xff1f; 在 Golang 的面试中&#xff0c;map 类型的使用是一个常见的考点&#xff0c;其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…

从 ClickHouse、Druid、Kylin 到 Doris:网易云音乐 PB 级实时分析平台降本增效

网易云音乐基于 Apache Doris 替换了早期架构中 Kylin、Druid、Clickhouse、Elasticsearch、HBase 等引擎&#xff0c;统一了实时分析架构&#xff0c;并广泛应用于广告实时数仓、日志平台和会员报表分析等典型场景中&#xff0c;带来导入性能提升 3&#xff5e;30 倍&#xff…