C# 常量

文章目录

  • 前言
  • 一、整数常量
    • (一)合法与非法实例对比
    • (二)不同进制及类型示例
  • 二、浮点常量
  • 三、字符常量
  • 四、字符串常量
  • 五、定义常量


前言

  在 C# 编程的世界里,常量是一类特殊的数据元素,它们如同程序中的 “定海神针”,代表着固定的值,在整个程序执行期间都不会发生改变。常量可以涵盖各种基本数据类型,包括整数常量、浮点常量、字符常量、字符串常量以及枚举常量等。
在这里插入图片描述

一、整数常量

  整数常量在 C# 中有着丰富的表示形式,可以是十进制、八进制或十六进制的常量,并且可以通过特定的前缀来指定基数。其中,使用 0x 或 0X 作为前缀表示十六进制,以 0 作为前缀表示八进制,而没有前缀的情况下则默认表示十进制。
  不仅如此,整数常量还能够添加后缀,后缀通常是 U(表示 unsigned,无符号)和 L(表示 long,长整型)的组合,它们既可以是大写形式也可以是小写形式,而且多个后缀能以任意顺序进行组合。不过需要注意的是,后缀的使用要遵循一定规则,不能随意重复或出现不符合语法规范的情况。
以下是各类整数常量的实例及详细解析:

(一)合法与非法实例对比

  • 212: 这是一个合法的十进制整数常量,没有添加后缀时,默认的数据类型会根据其数值范围适配,在这里它可以被当作 int 类型来处理,在程序中可用于表示一般性的整数值,例如循环的次数、数组的索引等。
  • 215u: 同样是合法的整数常量,后缀 u 表明它是一个无符号整数(unsigned int)类型,适用于那些只需要表示非负整数的场景,比如在处理内存地址、位掩码等情况时,无符号整数能更准确地反映数据特性。
  • 0xFeeL: 合法的表示形式,前缀 0x 说明是十六进制数,后缀 L 则将其定义为长整型(long),在需要表示较大范围的整数且明确为长整型数据时会这样使用,比如在处理一些大型的计数或者标识时可能会用到长整型的十六进制数。
    然而,也存在一些非法的实例:
  • 078: 是非法的八进制常量表示,因为在八进制数中,每位数字应该在 0 到 7 的范围内,而这里出现了数字 8,不符合八进制的语法规则,编译器在编译时会检测到这样的错误并提示。
  • 032UU: 这种写法是非法的,因为不能重复使用后缀,后缀只是用于一次性地明确整数的类型修饰,重复添加会导致语法错误,无法通过编译。

(二)不同进制及类型示例

  • 85: 这是一个典型的十进制整数常量,在日常编程中最为常见,可用于各种常规的整数运算场景,例如进行简单的数学计算、作为函数参数传递整数值等。
  • 0213: 属于八进制整数常量,通过前缀 0 来标识,在一些特定的底层编程或者与硬件交互的场景中,如果硬件设备采用八进制来表示数据,那么在程序中就需要使用这样的八进制常量来与之匹配,进行数据的传递和处理。
  • 0x4b: 是十六进制整数常量,十六进制常用于表示内存地址、颜色值(在图形编程中)等场景,因为它能够更紧凑地表示二进制数据,方便阅读和书写,例如在图形界面开发中,颜色的表示可能会采用十六进制形式来指定 RGB 各通道的值。
    从数据类型角度来看:
  • 30: 默认会被当作 int 类型的整数常量,在没有后缀修饰的情况下,编译器会根据其数值范围将它归为 int 类型,适用于大多数一般性的整数使用场景,比如作为计数器的初始值等。
  • 30u: 明确表示为无符号 int 类型,强调其只能表示非负整数,在涉及到位运算、内存相关操作等只需要处理非负整数的情况下使用。
  • 30l: 通过后缀 l(或 L)定义为 long 类型,用于处理超出 int 类型表示范围的较大整数,例如在处理大型文件的字节数、数据库中的记录编号等可能较大的整数值时,就需要使用长整型常量。
  • 30ul: 则是无符号长整型(unsigned long),集合了无符号和长整型的特点,用于表示较大范围的非负整数,在一些特定的系统编程或者大数据量处理场景中会发挥作用,比如在处理海量数据的索引或者标识时可能会用到。

二、浮点常量

  浮点常量在 C# 中有着特定的组成结构,它是由整数部分、小数点、小数部分和指数部分共同构成的。在表示形式上,可以采用小数形式或者指数形式来呈现浮点常量,不过每种形式都有相应的语法要求需要遵循。

  • 3.14159: 这是一个合法的采用小数形式表示的浮点常量,清晰地展示了整数部分、小数点以及小数部分,在数学计算、科学计算等涉及到带有小数精度的数值处理场景中经常会用到,比如在计算圆的面积(S = πr²,这里 π 可以用 3.14159 近似表示)时就会使用这样的浮点常量来参与运算。
  • 314159E-5L: 同样是合法的,它采用的是指数形式,其中 E(也可以是 e)用于表示指数部分,这里 E-5 表示乘以 10 的 -5 次方,后缀 L 表示该浮点常量为长双精度浮点型(long double),在需要更高精度的浮点数值表示或者处理科学计数法表示的较大或较小数值时会采用这种形式,例如在物理计算中处理极小的物理量(如电子的电荷量等)或者极大的天文距离等情况时。
    然而,存在一些不符合语法规则的非法实例:
  • 510E: 是非法的浮点常量表示,因为采用指数形式时,指数部分必须明确表示出指数的数值,这里只写了 E 却没有具体的指数值,不符合语法要求,编译器无法正确解析这样的表示形式。
  • 210f: 也是非法的,它既没有小数部分也没有指数部分,单独一个整数后面跟着 f(通常用于表示单精度浮点型 float)不符合浮点常量的构成规则,要表示单精度浮点型常量需要有正确的小数或者指数形式,比如 210.0f 或者 2.1E2f 等形式才是合法的。
  • .e55: 同样非法,因为使用指数形式表示时,必须包含整数部分、小数部分或同时包含两者,而这里缺少了整数部分,无法明确其具体数值含义,所以不符合浮点常量的语法规范。

三、字符常量

  字符常量是括在单引号里,例如,‘x’,且可存储在一个简单的字符类型变量中。一个字符常量可以是一个普通字符(例如 ‘x’)、一个转义序列(例如 ‘\t’)或者一个通用字符(例如 ‘\u02C0’)。
  在 C# 中,有一系列特定的字符在其前面带有反斜杠时会具有特殊的意义,这些转义序列码能够帮助我们在程序中方便地表示一些难以直接输入或者具有特殊功能的字符,以下是对部分转义序列及其含义的详细介绍:

在这里插入图片描述
以下是一个展示转义序列字符在实际代码中应用的实例:

namespace EscapeChar
{class Program{static void Main(string[] args){Console.WriteLine("Hello\tWorld\n\n");Console.ReadLine();}}
}

当上述代码被编译和执行时,会输出如下结果:

Hello   World

  在代码中,\t 起到了在 Hello 和 World 之间插入水平制表符的作用,使它们呈现出一定的间隔,看起来更像表格中的列对齐效果,而 \n 则实现了换行的功能,连续两个 \n 就产生了额外的空行,让输出的文本更加清晰美观,符合我们常见的文本展示习惯。

四、字符串常量

  字符串常量在 C# 中的表示形式主要是括在双引号 “” 里,或者是括在 @“”(逐字字符串)里。字符串常量所包含的字符类型与字符常量类似,涵盖了普通字符、转义序列以及通用字符等多种形式,不过在使用和处理上有着自身的一些特点和优势。

  • string a = “hello, world”;: 这是最常见的字符串常量表示形式,双引号内包含了普通的文本内容,用于表示一个简单的字符串,在程序中可以用于存储和展示文本信息,比如作为提示信息显示给用户(如在对话框中显示 “请输入用户名” 这样的提示语)、作为文件的名称、网页中的文本段落等各种涉及到文本处理的场景。
  • string b = @“hello, world”;: 这里采用的是逐字字符串的表示形式,使用 @ 符号加上双引号。逐字字符串的特点是,其中的转义字符(如 \)会被当作普通字符对待,不会进行转义操作。例如,在表示文件路径时,使用逐字字符串会更加方便直观,像 string path = @“C:\Windows\System32”;,不需要像普通字符串那样将反斜杠进行转义(写成 C:\Windows\System32),这样可以避免因转义字符过多而导致的书写和阅读错误,尤其在处理较长的路径或者包含大量反斜杠的字符串时优势明显。
  • string c = “hello \t world”;: 在这个字符串常量中,包含了转义序列 \t,它会在实际输出或者处理时被解析为制表符,所以当对这个字符串进行输出操作时,会在 hello 和 world 之间显示出一定的间隔,起到了格式化文本的作用,例如在控制台输出或者写入到文本文件中时,会呈现出类似表格列对齐的效果,让文本更加清晰有条理。
  • string d = @“hello \t world”;: 同样包含 \t,但由于是逐字字符串,这里的 \t 就被当作普通的字符序列 \t 来处理,而不会转换为制表符,输出时就会直接显示 hello \t world,在一些需要将转义字符原样保留的场景中会使用这种表示形式,比如在处理正则表达式字符串、配置文件中的特定文本内容等情况下,需要转义字符不被解析而是作为原始字符存在。
  • string e = “Joe said “Hello” to me”;: 为了在字符串常量中正确表示双引号字符,需要使用转义序列 ",这样才能将双引号作为字符串内容的一部分,避免与字符串的起始和结束双引号混淆,常用于表示包含引号的文本内容,比如记录对话、描述带有引号的语句等场景中,确保字符串能够准确地表达出完整的语义。
  • string f = @“Joe said ““Hello”” to me”;: 在逐字字符串中,要表示双引号,只需要连续写两个双引号即可,同样能够实现将双引号作为字符串内容的一部分,而且写法更加直观,避免了转义序列的使用,在处理一些复杂的文本内容且其中包含较多双引号的情况下,逐字字符串的这种表示方式可以让代码更加清晰易读,减少因转义字符带来的混淆。
  • string g = “\\server\share\file.txt”;: 在普通字符串中,如果要表示反斜杠字符,需要使用转义序列 \,所以这里连续的四个 \ 最终表示的是两个真实的反斜杠,用于构建正确的文件路径字符串,在涉及到网络共享文件路径、本地文件路径等需要准确表示反斜杠的场景中会这样书写字符串常量。
  • string h = @“\server\share\file.txt”;: 而逐字字符串则直接使用 \ 就能表示两个反斜杠,更加简洁明了地呈现出文件路径的字符串内容,同样用于文件路径相关的场景,尤其是在代码中频繁使用文件路径字符串时,逐字字符串的便利性就更加凸显出来了。
  • string i = “one\r\ntwo\r\nthree”;: 此字符串常量中
    包含了 \r\n 转义序列,在输出时会按照回车换行的效果进行展示,比如在文本文件中写入这样的字符串或者在控制台输出时,会呈现出如下格式:
one
two
three

  这在需要对文本进行分行排版,例如构建多行的提示信息、记录多行的数据内容等场景中十分常用,使得文本呈现出清晰的多行结构,方便阅读和查看。

  • string j = @“one two three”;: 逐字字符串可以直接换行书写,换行符以及缩进空格都会计算在字符串长度之内,输出时也会按照书写的格式原样呈现,同样能达到分行展示文本的效果,并且在编写长文本内容时,这种直接换行的方式更符合书写习惯,使得代码看起来更加清晰直观,无需像普通字符串那样使用 \r\n 等转义序列来刻意控制换行,在一些配置文件内容设置、代码中的长文本注释等场景中应用较为方便。

五、定义常量

  在 C# 中,常量是使用 const 关键字来进行定义的,其定义的语法如下:

const <data_type> <constant_name> = value;

  这里 <data_type> 明确了常量的数据类型,它必须是一个合法的 C# 基本数据类型或者枚举类型等,比如 int、double、string、自定义的枚举类型等;<constant_name> 则是给常量所取的名称,需要遵循 C# 中变量命名的相关规则,例如变量名可以包含字母、数字和下划线,必须以字母或下划线开头,区分大小写,并且要避免使用 C# 的关键字作为变量名;value 就是赋予该常量的固定值,这个值一旦确定,在后续的程序执行过程中是无法修改的。
以下是一个代码示例,展示了如何在程序中定义和使用常量:

using System;public class ConstTest
{class SampleClass{public int x;public int y;public const int c1 = 5;public const int c2 = c1 + 5;public SampleClass(int p1, int p2){x = p1;y = p2;}}static void Main(){SampleClass mC = new SampleClass(11, 22);Console.WriteLine("x = {0}, y = {1}", mC.x, mC.y);Console.WriteLine("c1 = {0}, c2 = {1}",SampleClass.c1, SampleClass.c2);}
}

在上述代码中:
  首先定义了一个名为 SampleClass 的内部类,在这个类中,除了定义了两个普通的整型成员变量 x 和 y 之外,还定义了两个常量 c1 和 c2。c1 被初始化为 5,而 c2 的初始化值是基于 c1 的值进行计算得到的(c1 + 5,也就是 10)。这里体现了一个重要特点,就是常量在定义时可以使用其他常量或者常量表达式来进行初始化,只要表达式中的值在编译时能够确定即可。
  然后在 Main 方法中,创建了 SampleClass 的一个实例 mC,并给实例的 x 和 y 成员变量分别赋值为 11 和 22。接着通过 Console.WriteLine 语句分别输出了实例变量 x 和 y 的值,以及类中的常量 c1 和 c2 的值。
当整个代码被编译和执行时,会产生如下结果:

x = 11, y = 22
c1 = 5, c2 = 10

  常量在程序中的作用不容小觑,它们能够提高代码的可读性和可维护性。例如,在一个数学计算相关的程序中,如果经常用到圆周率 π 的近似值,就可以定义一个常量 const double PI = 3.14159;,这样在整个程序的各个需要使用 π 值的地方,都可以直接使用这个常量,而不是每次都去写具体的数值。如果后续需要提高 π 的近似精度,只需要在定义常量的地方修改其值即可,其他使用该常量的代码无需变动,方便对代码进行统一的修改和维护。

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

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

相关文章

PHP 生成分享海报

因为用户端有多个平台&#xff0c;如果做分享海报生成&#xff0c;需要三端都来做&#xff0c;工作量比较大。 所以这个艰巨的任务就光荣的交给后端了。经过一定时间的研究和调试&#xff0c;最终圆满完成了任务&#xff0c;生成分享海报图片实现笔记如下。 目录 准备字体文件…

探索Python词云库WordCloud的奥秘

文章目录 探索Python词云库WordCloud的奥秘1. 背景介绍&#xff1a;为何选择WordCloud&#xff1f;2. WordCloud库简介3. 安装WordCloud库4. 简单函数使用方法5. 应用场景示例6. 常见Bug及解决方案7. 总结 探索Python词云库WordCloud的奥秘 1. 背景介绍&#xff1a;为何选择Wo…

git 学习笔记

目录 一、git 前期配置准备 1、托管平台的账号注册&#xff08;以gitee码云为demo&#xff09; 2、本地个人电脑配置 &#xff08;1&#xff09;配置用户属性 ​编辑 &#xff08;2&#xff09;配置SSH密钥 二、git 工作流程图 三、git 提交命令 &#xff08;1&#x…

uniapp中使用uni-forms实现表单管理,验证表单

前言 uni-forms 是一个用于表单管理的组件。它提供了一种简化和统一的方式来处理表单数据&#xff0c;包括表单验证、字段绑定和提交逻辑等。使用 uni-forms可以方便地创建各种类型的表单&#xff0c;支持数据双向绑定&#xff0c;可以与其他组件及API进行良好的集成。开发者可…

_C#_串口助手_字符串拼接缺失问题(未知原理)

最近使用WPF开发串口助手时&#xff0c;遇到一个很奇怪的问题&#xff0c;无论是主线程、异步还是多线程&#xff0c;当串口接收速度达到0.016s一次以上&#xff0c;就会发生字符串缺失问题并且很卡。而0.016s就一切如常&#xff0c;仿佛0.015s与0.016s是天堑之隔。 同一份代码…

JVM(JAVA虚拟机)内存溢出导致内存不足,Java运行时环境无法继续

1、先贴出服务最后打印出来的日志&#xff0c;意思就是给虚拟机分配的内存被用完了&#xff0c;没有可用的内存了&#xff0c;服务运行不了了&#xff0c;被动停服了。详细的日志记录在了/home/user/zx/tomcat/apache-tomcat-8.5.82/bin/hs_err_pid147951.log文件里。 Java Ho…

OGRE 3D----3. OGRE绘制自定义模型

在使用OGRE进行开发时,绘制自定义模型是一个常见的需求。本文将介绍如何使用OGRE的ManualObject类来创建和绘制自定义模型。通过ManualObject,开发者可以直接定义顶点、法线、纹理坐标等,从而灵活地构建各种复杂的几何体。 Ogre::ManualObject 是 Ogre3D 引擎中的一个类,用…

Spring Boot英语知识网站:架构与开发

4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式&#xff0c;是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示&#xff1a; 图4-1系统工作原理…

如何借助AI生成PPT,让创作轻松又高效

PPT是现代职场中不可或缺的表达工具&#xff0c;但同时也可能是令人抓狂的时间杀手。几页幻灯片的制作&#xff0c;常常需要花费数小时调整字体、配色与排版。AI的飞速发展为我们带来了革新——AI生成PPT的技术不仅让制作流程大大简化&#xff0c;还重新定义了效率与创意的关系…

Unity ShaderLab 实现网格爆炸

实现思路&#xff1a; 沿着3D物体每个面的法线&#xff0c;将面偏移一定的位置。 Shader Graph实现如下&#xff1a; Shader Lab 实现如下&#xff1a; Shader "Unlit/MeshExplode" {Properties{_MainTex ("Texture", 2D) "white" {}_Distan…

阅读《基于蒙特卡洛法的破片打击无人机易损性分析》_笔记

目录 基本信息 1 引言 1.1 主要研究内容 1.2 研究必要性&#xff08;为什么要研究&#xff09; 1.3 该领域研究现状&#xff08;别人做了什么/怎么做的&#xff09; 2 主要研究过程&#xff08;我们做了什么&#xff09; 2.1 建立目标仿真模型 2.2 确定毁伤依据 2.3 无…

如何让控件始终处于父容器的居中位置(父容器可任意改变大小)

1、改变父容器大小前 父容器是一个panel&#xff0c;控件是一个按钮button1 1&#xff09;刚开始让button1的左边距离panel的左边缘和button1的右边距离panel的右边缘两个距离相等&#xff1b; 2&#xff09;将button1的Anchor属性设置为None 2、改变父容器大小后 直接改变…

【线程】Java多线程代码案例(2)

【线程】Java多线程代码案例&#xff08;2&#xff09; 一、定时器的实现1.1Java标准库定时器1.2 定时器的实现 二、线程池的实现2.1 线程池2.2 Java标准库中的线程池2.3 线程池的实现 一、定时器的实现 1.1Java标准库定时器 import java.util.Timer; import java.util.Timer…

非递归遍历二叉树(数据结构)

我的博客主页 非递归遍历二叉树 前序遍历&#xff08;迭代&#xff09;中序遍历&#xff08;迭代&#xff09;后续遍历&#xff08;迭代&#xff09; 二叉树的遍历方式有&#xff1a;前序遍历、中序遍历、后续遍历&#xff0c;层序遍历&#xff0c;而树的大部分情况下都是通过递…

【CSS】一篇掌握CSS

不是因为有了希望才去坚持,而是坚持了才有了希望 目录 一.导入方式 1.行内样式 2.内部样式 3.外部样式(常用) 二.选择器 1.基本选择器(常用) 1.1标签选择器 1.2类选择器 1.3id选择器 2.层次选择器 2.1后代选择器 2.2子选择器 2.3相邻兄弟选择器 2.4通用兄弟选择器…

封装类与封装函数

目录结构 src/ ├── utils/ │ ├── test.js │ ├── Calculator.js ├── views/ │ ├── Home.vue ├── App.vue 共同点&#xff1a;模块导出与模块引入 封装函数 场景 简单、轻量级和性能敏感的场景&#xff0c;适合快速开发和维护。 优 可维护性&…

【论文阅读】Federated learning backdoor attack detection with persistence diagram

目的&#xff1a;检测联邦学习环境下&#xff0c;上传上来的模型是不是恶意的。 1、将一个模型转换为|L|个PD,&#xff08;其中|L|为层数&#xff09; 如何将每一层转换成一个PD&#xff1f; 为了评估第&#x1d457;层的激活值&#xff0c;我们需要&#x1d450;个输入来获…

5 Java字符串操作

字符串操作 1、String类1.1 声明字符串1.2 创建字符串 1.3 字符串连接 /连接字符串连接其他数据类型 1.4 提取字符串信息获取字符串长度length()获取指定位置的字符 charAt()获取子字符串索引位置 indexOf()判断字符串首尾内容 startsWith()/endsWith()获取字符数组 toCharArra…

IDEA报错: java: JPS incremental annotation processing is disabled 解决

起因 换了个电脑打开了之前某个老项目IDEA启动springcloud其中某个服务直接报错&#xff0c;信息如下 java: JPS incremental annotation processing is disabled. Compilation results on partial recompilation may be inaccurate. Use build process “jps.track.ap.depen…

Mybatis-基础操作

Mybatis的基础操作就是通过Mybatis完成对数据的增删改查。我们通过例子来引入这些操作&#xff0c;之前的项目较久远&#xff0c;因此我们从零开始进行准备工作&#xff1a; 搭建项目 一、创建数据库user_list并插入数据&#xff1a; -- 创建数据库 create table user_list …