预定义数据类型:
c#中把数据类型分为2种,一种是值类型,另一种是引用类型。值类型储存在堆栈中,而引用类型储存在托管堆中。引用类型与值类型的区别参考以下代码:
//引用类型给出的demo int[] x, y; x=new int[10]; x[0] = 10; y = x; y[0] = 20; Console.WriteLine(x[0]); //值类型给出的demo bool a, b; a = true; b = a; b = false; Console.WriteLine(a);
这个例子的输出结果是20和True.它说明,这2个引用变量虽然进行了赋值,但托管堆中只保留了一个引用,都指向了同一块区域。而值类型则不同,当一个布尔类型变量a赋值为true之后,再将a的值赋值给b,堆栈中就会有2个布尔值。
c#认可的基本预定义类型没有内置于c#语言中,而是内置于.net Framework中。当声明一个int类型的数据时,实际上是声明了一个System.Int32的一个实例。目前看来这样的做法,有这样的好处:
- 为多语言的交互铺路,形成了一个Common Type System。
- 使得基本的数据类型可以看做是支持某些方法的类,其声明出来的数据是支持这些方法的实例。如:
int i = 10; string str = i.ToString(); Console.WriteLine(str);
c#有15个预定义类型,13个是值类型,2个引用类型:string,object:
- 所有的整数类型的变量都可以赋予十进制或十六进制的值。
- 对一个整数是int,uint,long或ulong没有显示的声明,都默认为int。(显示的声明可以在数字后面加上L或UL)
- 代码中没有对某个非整数类型硬编码,则默认为一个double类型。
- decimal不是基本类型,所以在计算时使用会有性能的损失。
- char包含16位。一部分原因是不允许char和byte进行隐式的转换;另外,尽管8位足够编码英语中的每个字符和数字0~9,但不能够编码更大的符号系统中的每个字符(如:中文)。为了面向全世界,计算机行业正从8位字符集向16位的Unicode模式转变。
string a = "a string"; string b = a; Console.WriteLine("a is "+a); Console.WriteLine("b is "+b); a = "another string"; Console.WriteLine("a is "+a); Console.WriteLine("b is "+b);
这是我总结的c#预定义类型的mindmap,大致囊括了各个类型的基本信息。其中string类型稍微有点特殊,这里单独抽出来谈谈,尤其注意到string是预定义类型中为数不多的引用类型,代码如上。挺有意思的是,按照之前引用类型与数值类型比较的例子得出的结论,最后一条应该输出“b is another string”。可事实并不是我们想象的那样。虽然string对象保留在堆上,但string的一些常用操作会与其他引用类型有所区别:修改一个字符串,就会创建一个全新的string对象。修改a的值,不是替换了原先的,而是在堆上重新分配了一个新的对象。——这是运算符重载造成的。
流控制:
foreach循环不能修改集合中各项数据的值。虽然这个规则并不是知识体系中的漏洞,但作为之前接触不多的循环结构,还是要总结出来提醒自己。