《C#本质论》第二章学习笔记

301 阅读4分钟

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语言的思维去初步理解。