C#,入门教程(31)——预处理指令的基础知识与使用方法

news2024/12/24 8:08:51

上一篇:

 C#,入门教程(30)——扎好程序的笼子,错误处理 try catchicon-default.png?t=N7T8https://blog.csdn.net/beijinghorn/article/details/124182386

Visual Studio、C#编译器以及C#语法所支持的预处理指令,绝对是天才设计
编译程序的时候会发现,程序可以编译成 bebug 和 release 模式,分别保存于相应的文件夹。
编写工业软件,一定有下面两个必然的需求。

一、程序的调试版本与正式版本

有些代码,仅用于调试(debug)版本,比如一些中间结果、调试信息的输出;

在正式(release )版本中,这些代码不应该被编译。

仅仅出现于 调试版本的代码,可以用户 #if DEBUG #endif 包括起来。

#if DEBUG

    Log.Write("DEBUG LINE 001");

#endif

同理,仅仅出现于正式版本的代码:

#if RELEASE

    File.Write("result.dat", dataBuffer, Encoding.UTF8);

#endif

二、不同版本程序的简约管理

工业软件的每一“段”代码,都属于“千锤百炼”,会有多个版本。
保存不同的版本,可以通过版本控制、文件控制等等很多方式。
但其中最有效与直接,程序员乐于接受的却是用“预处理指令”。

计算两点之间的距离,第一个版本:

public int Distance(int ax, int ay, int bx, int by)
{
    return (int)Math.Sqrt((ax-bx)*(ax-bx)+(ay-by)*(ay-by));
}

这个版本,显然有问题,可以改进:

#if _VERSION_01_
public int Distance(int ax, int ay, int bx, int by)
{
    return (int)Math.Sqrt((ax-bx)*(ax-bx)+(ay-by)*(ay-by));
}
#endif

public int Distance(int ax, int ay, int bx, int by)
{
    int dx = ax - bx;
    int dy = ay - by;
    return (int)Math.Sqrt(dx * dx + dy * dy);
}

注意,这里并没有删除就的代码,而是用一个未定义名称的预处理语句包括起来了。

第一个算法的代码,不会被编译。

继续改进:

#if _VERSION_01_
public int Distance(int ax, int ay, int bx, int by)
{
    return (int)Math.Sqrt((ax-bx)*(ax-bx)+(ay-by)*(ay-by));
}
#endif

#if _VERSION_02_
public int Distance(int ax, int ay, int bx, int by)
{
    int dx = ax - bx;
    int dy = ay - by;
    return (int)Math.Sqrt(dx * dx + dy * dy);
}
#endif

public int Distance(int ax, int ay, int bx, int by)
{
    int dx = ax - bx;
    int dy = ay - by;
    int dd = dx * dx + dy * dy;
    if(dd == 0) return 0;
    return (int)Math.Sqrt(dd);
}

--------------------------------------------------------
POWER BY TRUFFER.CN

下一篇:

C#,入门教程(32)——程序运行时的调试技巧与逻辑错误探针技术与源代码icon-default.png?t=N7T8https://blog.csdn.net/beijinghorn/article/details/126014885

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

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

相关文章

【技术】SpringBoot 接口怎么加密解密

1. 介绍 在我们日常的Java开发中,免不了和其他系统的业务交互,或者微服务之间的接口调用 如果我们想保证数据传输的安全,对接口出参加密,入参解密。 但是不想写重复代码,我们可以提供一个通用starter,提…

代码随想录算法训练营第14天 | 二叉树的前序、中序、后序遍历(递归+迭代法)

二叉树的理论基础:(二叉树的种类,存储方式,遍历方式 以及二叉树的定义) https://programmercarl.com/%E4%BA%8C%E5%8F%89%E6%A0%91%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html 二叉树的递归遍历 Leetcode对应的三道习…

这种环境下腾讯64亿在北京拿地?

近期,金融市场出现较大波动,A股指数跌至2700点,同时恒生指数也下滑至15000点,引发了社会各界的关注和思考。与此同时,腾讯以64.2亿元拿下北京海淀区地块,马云和蔡崇信又增持阿里股票,这一系列的…

自学网安-DNS

01DNS Domain Name Service域名服务 作用:为客户机提供域名解析服务器 02域名组成 2.1域名组成概述 如"www.sina.com.cn"是一个域名,从严格意义上讲,"sina.com.cn"才被称为域名(全球唯一),而"www"…

【若依】前后端分离框架部署

1.拉取若依项目代码 进入若依 基于SpringBootVue前后端分离的Java快速开发框架,并通过相应协议拉取到本地IDE 2.前端部署 2.1.下载nodejs 进入nodejs官网下载所需版本, 完成后在命令行运行npm -v可查询版本 2.2.配置依赖 在若依ui目录下运行 np…

Linux第33步_TF-A移植的第1步_创建新的设备树

TF-A移植第1步就是创建新的设备树,并命名为“stm32mp157d-atk”。 和“TF-A移植”有关的知识点: 1)设备树英文名字叫做Device tree,用来描述板子硬件信息的,比如开发板上的 CPU有几个核 、每个CPU核主频是多少,IIC、…

web安全学习笔记【10】——数据包分析

基础[1] [2] [3] [4] 入门-HTTP数据包&Postman构造&请求方法&请求头修改&状态码判断[5] [6] [7] #知识点: 1、Web常规-系统&中间件&数据库&源码等 2、Web其他-前后端&软件&Docker&分配站等 3、Web拓展-CDN&WAF&OS…

[go语言]数据类型

目录 知识结构 整型、浮点型 1.整型 2.浮点型 复数、布尔类型 1.复数 2.布尔类型 字符与字符串 1.字符串的格式化 2.字符串的截取 3.格式化好的字符串赋值给量 4.字符串的转换 5.strings包 知识结构 整型、浮点型 1.整型 在Go语言中,整型数据是一种基…

零基础学Python(5)— 基本数据类型

前言:Hello大家好,我是小哥谈。在内存中存储的数据可以有多种类型。例如:一个人的姓名可以用字符型存储,年龄可以使用数值型存储,婚姻状况可以使用布尔型存储。这里的字符型、数值型、布尔型都是Python语言中提供的基本…

MyBatis的逆向工程的创建,generator插件的使用和可能出现的一些问题,生成的实体类多出.java 1 .java 2这种拓展文件的处理方案

目录 创建逆向工程的步骤 ①添加依赖和插件 ②创建MyBatis的核心配置文件 ③创建逆向工程的配置文件 ④执行MBG插件的generate目标 数据库版本8有可能出现的问题: 1、生成的实体类多了.java 1 .java 2的拓展文件... 2、生成的属性与表中字段不匹配&#xff…

orm-04-Spring Data JPA 入门介绍

拓展阅读 The jdbc pool for java.(java 手写 jdbc 数据库连接池实现) The simple mybatis.(手写简易版 mybatis) Spring Data JPA Spring Data JPA,作为更大的 Spring Data 家族的一部分,使得基于 JPA 的仓库实现变得更加容易。…

微信小程序首页、界面布局、功能简洁(示例三)

微信小程序首页界面布局、页面简洁,功能简单 直接上具体代码: 1、js代码 Page({/*** 页面的初始数据*/data: {imgList: [../../images/demo.jpg, ../../images/demo.jpg, ../../images/demo.jpg],navList: [{src: ../../images/nav1.png,title: 菜单一}…

硬件基础:组合逻辑电路

什么是组合逻辑电路 组合逻辑电路是由一些基本的逻辑门电路组成的,没有反馈,输出仅取决于输入。 组合逻辑电路是数字逻辑电路中一种重要的电路类型,它是由多个逻辑门(例如与门、或门、非门等)组成的电路。组合逻辑电路…

vue3和vite项目在scss中因为本地图片,不用加~

看了很多文章说要加~,真的好坑哦,我的加了~反而出不来了: 304 Not Modified 所以需要去掉~: /* 默认dark主题 */ :root[themered] {--bg-color: #0d1117;--text-color: #f0f6fc;--backImg: url(/assets/images/redBg.png); }/* …

Go语言学习笔记:基础语法和类型

Go语言学习笔记:基础语法和类型 目录 Go语言学习笔记:基础语法和类型学习路线前言变量声明常量数据类型布尔型(Boolean)整型(Integer)浮点型(Floating point)复数型(Comp…

解读 EventBridge Transform:数据转换和处理的灵活能力

云布道师 阿里云 EventBridge 提供了强大而灵活的事件总线服务,它可以连接应用程序、阿里云云服务和阿里云 Serverless 服务来快速构建 EDA(Event-driven Architectures)事件驱动架构,驱动应用与应用,应用与云的连接。…

从一到无穷大 #21 从基于多数据模型分析负载的Benchmark讨论多模数据库的发展方向

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。 本作品 (李兆龙 博文, 由 李兆龙 创作),由 李兆龙 确认,转载请注明版权。 文章目录 引言M2Bench测试结果从Lindorm看待多模的发展方向总结 引言 《M2Bench: A Database …

echarts:折线图的常用操作

文章目录 背景基础折线图添加一些样式区域高亮 背景 本文将带大家一步一步的熟悉折线图相 API,关于如何初始化,可以看我这篇文章 echars:图表中核心的概念,本文只讲核心配置。 基础折线图 option {xAxis: {type: category,// …

VUE+Vis.js鼠标悬浮title提前显示BUG解决方法

在使用VUEVis.js做拓扑图,利用鼠标悬浮放在图标展示设备信息时,发现鼠标一放在图标上面时,标题表会提前在放置的元素下显示,鼠标再放到图标上去元素才会隐藏变成悬浮状态 解决方法: 添加一个div元素,设置v…

从零开始训练 YOLOv8最新8.1版本教程说明(包含Mac、Windows、Linux端 )同之前的项目版本代码有区别

从零开始训练 YOLOv8 - 最新8.1版本教程说明 本文适用Windows/Linux/Mac:从零开始使用Windows/Linux/Mac训练 YOLOv8 算法项目 《芒果 YOLOv8 目标检测算法 改进》 适用于芒果专栏改进 YOLOv8 算法 文章目录 官方 YOLOv8 算法介绍改进网络代码汇总第一步 配置环境1.1 系列配…