C#数据类型
大部分语言学习书籍,讲完Hello World程序后都是讲这门语言所用到的基本数据类型,《C#本质论》也不例外。C#有非常多的数据类型,这也是面向对象语言的特点,但是不管什么编程语言,繁杂的数据类型都是有几种基础类型所组成的。
基元类型
C#各种复杂类型是由十三种基元类型,也叫预定义类型所组成的,包括八种整数、三种浮点数、布尔、字符。
整数类型
C#的整数类型不同于C语言是基于int这一种类型,而是在概念上相互独立的。
-
byte和sbyte:长度为八位的整数,sbyte带符号,byte不带符号,byte取值范围是0~255
-
short和ushort:长度为十六位的整数,与C语言一样,前面的u是不带符号的意思,取值范围通C语言。
-
int和uint:长度为三十二位的整数,与C语言的int基本相同。
-
long和ulong:长度为64位,与C语言基本相同。
浮点数类型
C#拥有三种浮点数类型:
- float:长度为三十二位的浮点数,本质上是二进制的。
- double:长度为64位的浮点数,本质上也是二进制的。
- decimal:C#特有的浮点数类型,主要是金融计算领域使用,不同于float和double,它是是十进制的。
布尔类型
布尔类型在C#中的全称是Boolean类型,实际大小为1字节(因为只存储True和False)
字符类型
char在C#中为16位的,取值范围对应的是Unicode字符,Unicode是国际性标准。
字面值与硬编码
C#字面值的概念与C基本相同。
不过这本书提到了一个注意事项,就是硬编码--直接写在源代码里的字面量,使用时需要慎重考虑。原因是如果需要修改程序中的硬编码,就得修改源代码,这样既不安全,工作量也较大,书中建议在源代码中尽量不要使用硬编码,而这些值最好储存在外部,使用配置文件等外部来源提供值是更加灵活和安全的方法。
字符串及其方法
字符串本质上就是0个或多个字符的有限序列。在C#中,字符串是独立的数据类型,不同于C语言中字符串本质上是空字符结尾的字符数组。
C#提供了很多特殊的字符串表示方法,如第一章提到过的**@前缀**,它能使显示字符串时忽略掉字符串里的转义字符。
class HW{
static void Main(){
System.Console.Write(@"WDNMD\n");
}
}
输出:
WDNMD\n
以及字符串插值,**要在@前面,不然@会把差值符号也给“忽略”掉。
class HW{
static void Main(){
string a = "WDNMD";
System.Console.Write($@"Hi,{a}\n");
}
}
输出:
Hi,WDNMD\n
C#中有很多字符串方法,分为静态方法和实例方法,静态方法是必须要在方法前面加上类型名,如:
//Format方法是静态方法
string text;
string a,b;
a = "CXK";
b = "LGSSS";
text = string.Format("WDNMD,{0},{1}!",a,b);
而实例方法是不需要前面加类型名的,直接变量后接点运算符和方法名即可。
string a,b;
a = "CXK";
b = "LGSSS";
a = a.ToLower();
b = b.ToLower();
不过,第一章也提到过,C#中的字符串本身是不可变的量,上面的转换大小写的方法,本质上是先创造了一个新的内存空间,把a原本的量一个一个对应的小写字母写入新内存中,写完后将a原本的内存地址垃圾回收,将新的内存地址作为a的内存和值。
类型转换
C#中的类型转换与C有共同点,也有不同点。
1.显示转换:与C大致相同,在赋值运算符后接一个括号,里面写上要转换成的类型。编译器会确认到底能否转换,不能就会报错。
2.隐式转换:同C语言,编译器会确认到底能否转换,不能就会报错。
3.方法转换:C#中,提供了字符串和其他数据类型之间互相转换的方法。
字符串转其他类型,使用目标类型名.Parse(),不过要注意,只有少部分类型可以从string转换而来。
不过,所有类型都可以转换成string,使用Tostring()即可。
小结
C#的基础数据类型有很多不同于C语言的地方,不过依然可以用C语言的思维去初步理解。