文章目录
- 前言
- 一、整数常量
- (一)合法与非法实例对比
- (二)不同进制及类型示例
- 二、浮点常量
- 三、字符常量
- 四、字符串常量
- 五、定义常量
前言
在 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;,这样在整个程序的各个需要使用 π 值的地方,都可以直接使用这个常量,而不是每次都去写具体的数值。如果后续需要提高 π 的近似精度,只需要在定义常量的地方修改其值即可,其他使用该常量的代码无需变动,方便对代码进行统一的修改和维护。