4.3 C#基本操作
C#语言的基本操作包括常量和变量数据的使用,用变量(Variable)来保存数据;C#语言通过装箱和拆箱机制使得在变量类型之间都可以相互转换通过;通过Console类实现控制台的输入输出;通过String类实现字符串操作。
4.3.1 变量和常量
1.变量
C#同样用变量(Variable)来保存数据,前一节已经给出了多个使用变量的例子,在此进行简单总结。C#中变量的命名原则与C和C++相似,但略有不同。
● 变量名必须以字母、下划线或@开头。
● 其后的字符可以是字母、数字和下划线,不能包含空格、标点符号和运算符等其他符号。
● 变量名不能与C#中的关键字名称相同。
● 变量名不能与C#中的库函数名称相同。
C#变量分为七种类型,分别是:静态变量(Static Variables)、非静态变量(Instance Variables)、数组元素(Array Elements)、值参数(Value Parameters)、引用参数(Reference Parameters)、输出参数(Output Parameters)和局部变量(Local Variables)。
2.常量
常量就是其值固定不变的量。从数据类型角度来看,常量的类型可以是任何一种值类型或引用类型。常量的声明使用const关键字,下面是一个常量声明的例子。
4.3.2 装箱和拆箱
object类是所有其他类型的基类,C#的所有类型都直接或间接地从object类继承。因此对一个object的变量可以赋予任何类型的值。
装箱(Boxing)和拆箱(Unboxing)是在C#语言的类型系统中提出的一个核心概念。装箱和拆箱机制使得在C#类型系统中的任何值类型、引用类型和object对象类型之间都可以相互转换。装箱和拆箱使值类型能够被视为对象。对值类型装箱将把该值类型打包到object引用类型的一个实例中。拆箱将从对象中提取值类型。下面是一个装箱、拆箱及使用object对象的例子。
在此实例中,整型变量y被装箱并赋值给对象obj1,拆箱后再将其值提取到整型变量z中。运行结果为:
可以看出拆箱过程是装箱过程的逆过程。值得注意的是,装箱转换和拆箱转换必须遵循类型兼容原则。
4.3.3 控制台输入和输出
C#程序所有的控制台输入输出功能都通过Console类完成。Console是在System命名空间中已经定义好的一个类,可以使用它的公共方法来完成控制台的输入和输出功能。Console类常用的公共方法见表4-3。
表4-3 Console类常用的公共方法
下面是一个完成控制台输入、输出的例子。
运行结果为:
在上述代码中,先调用Console的WriteLine方法显示一行提示文字,再调用ReadLine方法等待用户输入,将输入的一行文本存放到字符串变量word中,再调用WriteLine输出结果。
Console中另外两个常用的输入、输出方法是:Read和Write。它们和ReadLine与WriteLine的不同之处在于,ReadLine和WriteLine执行时相当于在显示时多加了一个回车键,而使用Read和Write时则光标不会自动转移到下一行。
4.3.4 字符串处理
大多数实际应用中都会经常用到字符串的处理。C#所提供的字符串类具有丰富的字符处理功能。
1.使用string
C#字符串是使用string关键字声明的一个字符数组。声明字符串常量使用双引号,例如:
字符串作为一个类,提供了很多有用的公共方法进行通用的字符串操作,表4-4列出了其中最常用的部分。
表4-4 string类常用的公共方法
(续)
上述公共方法都通过点操作符来调用,其语法为:
下面对表4-4中一些常用公共方法进行介绍。
字符串对象提供的CompareTo()方法用于比较两个字符串,可以得到某个字符串是否小于、等于或大于另一个字符串。使用方法为:
其返回值是一个整数,反映两个字符串间的大小关系。
● i小于零:stringA小于stringB。
● i等于零:stringA等于stringB。
● i大于零:stringA大于stringB。
例如:
运行结果为:
如果仅仅是要知道两个字符串是否相等,最简单的方法是使用==和!=运算符。如:
运行结果为:
对于熟悉Java的程序员来说,在需要比较两个字符串是否相等时可能更喜欢使用Equals方法。C#也提供了Equals方法,例如:
运行结果为:
如果不是进行字符串的完整比较,而只是判断当前字符串的开头是否与指定的字符串匹配,可使用StartsWith方法,例如:
运行结果为:
两个字符串的连接还可以直接采用+运算符,例如:
使用Concat方法更灵活,可以连接多个字符串或对象,例如:
上面两段程序连续执行的输出为:
空字符串是字符串的特殊情况,往往需要进行特殊处理,因此判断字符串是否为空就显得特别重要。
字符串为null和字符串等于""是有区别的。字符串为null表示这个字符串根本就不存在;而字符串等于""则表示存在一个字符串,只不过它的字符个数为0。而在实际应用中又往往需要对这两种情况进行同样的处理,这时就可以用IsNullOrEmpty方法进行判断,例如:
运行结果为:
有时往往需要向字符串的后面或前面填充字符,使其达到指定长度,比如想在输出时得到左对齐或右对齐的效果。这时可使用字符串的PadLeft或PadRight方法,例如:
运行结果为:
如果要去掉字符串开头或结尾的指定字符,则需要使用Trim、TrimEnd和TrimStart等方法。
在C#中,很多类型的对象都提供了ToString方法,用于将其值转换为字符串,例如:
运行结果为:
字符串对象也提供ToString方法,但执行字符串对象的ToString方法不进行实际转换。
字符串类中还有一个公共属性Length,可以用来获取字符串长度。字符串也可以像数组一样用[]加下标来获取指定位置的字符。在字符串中也可以使用转义符,如“\n”(换行)和“\t”(制表符)等。下面的例子展现了这些特性。
运行结果为:
关于字符串公共方法的更详细的说明可以查阅VS2017的联机帮助。
2.使用StringBuilder
string对象是“不可变的”,即它们一旦创建就无法更改,对string对象进行操作实际上返回的是新的字符串对象。出于性能方面的考虑,如果字符串需要频繁执行如连接等操作,应当使用StringBuilder类,例如:
运行结果为:
StringBuilder类创建一个字符串缓冲区,用于在程序执行大量字符串操作时提供更好的性能。StringBuilder还允许修改字符串中的个别字符,这是string类型所不支持的。例如下面代码在不创建新字符串的情况下更改了原字符串的内容:
运行结果为: