C# 常量

news2024/11/28 15:52:47

文章目录

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


前言

  在 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.coloradmin.cn/o/2249163.html

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

相关文章

C++11新增的特性

一.列表初始化/{}初始化 回顾&#xff1a;C98中⼀般数组和结构体可以⽤{}进⾏初始化。 1.C11中&#xff0c;一切对象皆可用{}初始化&#xff0c;内置类型⽀持&#xff0c;⾃定义类型也⽀持&#xff08;⾃定义类型本质是类型转换&#xff0c;中间会产⽣临时对象&#xff0c;最…

SAP学习

1、概述 2、SD 2.1 销售中的企业结构 2.2流程概览

Linux之网络基础

网络发展 网络的发展可以从人与人之间的工作模式开始谈起, 人与人的工作模式反应了机器与机器的工作模式: 1. 独立模式: 在网络发展的早期计算机间处于独立模式, 计算机之间相互独立 最开始计算机之间是独立运行的, 数据之间的交互需要人用软盘等存储介质拷贝过去, 一般涉及…

数字图像处理(9):VGA接口及其时序

&#xff08;1&#xff09;特点&#xff1a;成本低、结构简单、应用灵活 VGA接口需要五个信号&#xff1a;R、G、B、Hsync、Vsync &#xff08;2&#xff09;VGA的工作原理&#xff1a; 设定一个高速时钟信号&#xff08;像素时钟&#xff09;来控制每个像素的传输速率&#…

111. UE5 GAS RPG 实现角色技能和场景状态保存到存档

实现角色的技能存档保存和加载 首先&#xff0c;我们在LoadScreenSaveGame.h文件里&#xff0c;增加一个结构体&#xff0c;用于存储技能相关的所有信息 //存储技能的相关信息结构体 USTRUCT(BlueprintType) struct FSavedAbility {GENERATED_BODY()//需要存储的技能UPROPERT…

【jmeter】服务器使用jmeter压力测试(从安装到简单压测示例)

一、服务器上安装jmeter 1、官方下载地址&#xff0c;https://jmeter.apache.org/download_jmeter.cgi 2、服务器上用wget下载 # 更新系统 sudo yum update -y# 安装 wget 以便下载 JMeter sudo yum install wget -y# 下载 JMeter 压缩包&#xff08;使用 JMeter 官方网站的最…

图像算法在生物医药领域的应用

摘要&#xff1a; 随着科技的飞速发展&#xff0c;图像算法在生物医药领域的应用日益广泛且深入。本文详细阐述了图像算法在生物医药多个方面的应用&#xff0c;包括医学影像诊断、病理图像分析、药物研发、细胞图像研究以及生物医学工程等。通过对这些应用的探讨&#xff0c;展…

注意力(Attention)机制详解(附代码)

Attention机制是深度学习中的一种技术&#xff0c;特别是在自然语言处理&#xff08;NLP&#xff09;和计算机视觉领域中得到了广泛的应用。它的核心思想是模仿人类的注意力机制&#xff0c;即人类在处理信息时会集中注意力在某些关键部分上&#xff0c;而忽略其他不那么重要的…

Jmeter测试nginx部署的静态网页最大在线人数

一、下载Jmeter apache-jmeter-5.4.3.tar资源-CSDN文库 解压之后&#xff0c;双击ApacheJMeter.jar,即可打开 二、测试最大在线人数 1、plugins-manager下载安装 起初刚解压的jmeter里面没有插件管理这个选项 去官网下载&#xff1a;Install :: JMeter-Plugins.org 将下载j…

【深度学习|目标跟踪】StrongSort 详解(以及StrongSort++)

StrongSort详解 1、论文及源码2、DeepSort回顾3、StrongSort的EMA4、StrongSort的NSA Kalman5、StrongSort的MC6、StrongSort的BOT特征提取器7、StrongSort的AFLink8、未完待续 1、论文及源码 论文地址&#xff1a;https://arxiv.org/pdf/2202.13514 源码地址&#xff1a;https…

Scala关于成绩的常规操作

score.txt中的数据&#xff1a; 姓名&#xff0c;语文&#xff0c;数学&#xff0c;英语 张伟&#xff0c;87&#xff0c;92&#xff0c;88 李娜&#xff0c;90&#xff0c;85&#xff0c;95 王强&#xff0c;78&#xff0c;90&#xff0c;82 赵敏&#xff0c;92&#xff0c;8…

OpenAI Whisper 语音识别 模型部署及接口封装

环境配置: 一、安装依赖&#xff1a; pip install -U openai-whisper 或者&#xff0c;以下命令会从这个存储库拉取并安装最新的提交&#xff0c;以及其Python依赖项&#xff1a; pip install githttps://github.com/openai/whisper.git 二、安装ffmpeg&#xff1a; cd …

草图大师2020安装教程附安装包下载

软件介绍 草图大师&#xff08;Sketchup&#xff09;是由谷歌公司推出的一款环保型3D建模软件。草图大师可以快速和方便地创建、观察和修改三维创意&#xff0c;具有沿路径放样、导入的2D物体可随视角转动、布尔运算等功能。传统铅笔草图的优雅自如&#xff0c;现代数字科技的…

野火直播 5.7.5x | 频道丰富,有国外频道,部分支持回看

野火直播是一款专为电视盒子设计的电视直播软件&#xff0c;提供海量的电视直播资源和丰富的内容选择。涵盖全球多地的电视台直播源&#xff0c;包括央视、卫视、地方台、海外台等上千个电视频道。软件界面简洁&#xff0c;操作便捷&#xff0c;支持高清流畅播放&#xff0c;并…

题解 洛谷 Luogu P1182 数列分段 Section II 二分答案 C/C++

题目传送门&#xff1a; P1182 数列分段 Section II - 洛谷 | 计算机科学教育新生态https://www.luogu.com.cn/problem/P1182思路&#xff1a; 二分答案&#xff0c;每次以区间 [l, r] 中点 m 为每段和的阈值 判断在此前提下&#xff0c;划分段数是否不大于 M 是就记录答案…

Rust语言俄罗斯方块(漂亮的界面案例+详细的代码解说+完美运行)

tetris-demo A Tetris example written in Rust using Piston in under 500 lines of code 项目地址: https://gitcode.com/gh_mirrors/te/tetris-demo 项目介绍 "Tetris Example in Rust, v2" 是一个用Rust语言编写的俄罗斯方块游戏示例。这个项目不仅是一个简单…

Hot100 - 除自身以外数组的乘积

Hot100 - 除自身以外数组的乘积 最佳思路&#xff1a; 此问题的关键在于通过两次遍历&#xff0c;分别计算从左侧和右侧开始的累积乘积&#xff0c;以此避免使用额外的除法操作。 时间复杂度&#xff1a; 该算法的时间复杂度为 O(n)&#xff0c;因为我们只需要遍历数组两次。…

通过抓包,使用frida定位加密位置

首先我们抓取一下我们要测试的app的某一个目标api&#xff0c;通过抓api的包&#xff0c;得到关键字。 例如&#xff1a;关键字&#xff1a;x-sap-ri 我们得到想要的关键字后&#xff0c;通过拦截 类&#xff0c;寻找我们的关键字&#xff0c;及找到发包收包的位置&#xff0c…

【模型学习之路】TopK池化,全局池化

来学学图卷积中的池化操作 目录 DataBatch Dense Batching Dynamic Batching DataBatch 存取操作 TopKPooling GAP/GMP 一个例子 后话 DataBatch 当进行图级别的任务时&#xff0c;首先的任务是把多个图合成一个batch。 在Transformer中&#xff0c;一个句子的维度是…

<项目代码>YOLOv8 停车场空位识别<目标检测>

YOLOv8是一种单阶段&#xff08;one-stage&#xff09;检测算法&#xff0c;它将目标检测问题转化为一个回归问题&#xff0c;能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法&#xff08;如Faster R-CNN&#xff09;&#xff0c;YOLOv8具有更高的…