C#高级编程学习笔记(2011年6月5日)
时间:2011-06-05 来源:雨过天晴C#
第三章 对象和类型
1、类和结构
-
类存储在堆上的引用类型,而结构是存储在栈上的值类型
-
较小的数据类型使用结构可以提高性能
2、类
-
类的成员分为数据成员和函数成员,其中数据成员包括:字段、常量、事件,函数成员包括:方法、属性、索引器、运算符、构造函数、终结器(finalizer)
-
给方法传递参数可以是值传递和引用传递,对于复杂的数据类型,俺引用传递的效率更高,因为不需要复制大量的数据。
-
如果要使用引用传递可以使用关键字ref.
-
如果要向方法体外返回多个参数,可以使用out关键字。在方法的输入参数前面加out关键字,传递给该方法的变量可以不初始化。
-
命名参数允许按任意顺序传递,而传统参数一般需要俺定义的顺序传送给方法。
例如方法FullName(string firstName, string lastName),可以使用FullName(lastName: "ming", firstName: "xiao")调用。使用此种方法的好处在于可以从调用方法看出那个参数对应那个值,即明白每个参数对应的参数值。 -
可选参数:参数也可以是可选的,但是必须为可选参数提供默认值,且可选参数必须是方法定义的最后一个参数
-
方法的重载:方法重载必须使方法的几个版本有不同的签名,两个方法不能仅仅从返回类型来判断,两个方法不能仅仅从参数声明为ref还是out来区分
-
可以为属性创建只读属性和只写属性,但是用属性来创建只写属性不是一个好的编程习惯,可以用方法来代替
-
可以给属性的set和get两个访问器设置不同的修饰符,但是必须有一个具备属性的访问级别
-
自动实现的属性:如public int Age{get;set;}
-
使用属性而不直接使用字段时不需要担心这种编程方式会带来性能的损失。
3、构造函数
一般情况下,如果类没有提供构造函数,编译器会在后台创建一个默认的构造函数,把类中的成员字段初始化(值类型初始化为0,引用类型初始化为null)。只用在没有定义任何构造函数时,编译器才会自动提供默认的构造函数。
-
静态构造函数:使用静态构造函数的原因是,类的一些静态字段和属性,需要在第一次使用类之前,从外部源中初始化这些静态字段和属性。.NET运行库没有确保什么时候执行静态构造函数,所以不应该把要求在某个特定时刻执行的代码放在静态构造函数中。但是可以可以确保的是静态构造函数至多运行一次也只运行一次。
-
静态构造函数没有任何修饰符,也不带任何参数,一个类只能有一个静态构造函数,且静态构造函数只能访问静态成员,不能访问类的实例成员
4、只读字段
-
只读字段有两个关键字:readonly和const
-
readonly可以在构造函数中赋值,而const不能,所以readonly比const要灵活。
-
只读字段可以是实例字段也可以是静态字段
-
我们可以不需要把只读字段设为私有的,因为按照定义只读字段在外部不能为修改
5、结构
结构是值类型不是引用类型,结构不支持继承,但是它是继承自System.ValueType,而System.ValueType又派生自System.Object。编译器总是给结构提供一个无参数的默认的构造函数,不是不允许替换的。
-
因为结构是值类型,所以new运算符和其他的引用类型的工作方式不同,new运行在声明结构时不分配堆中的内存,而只是调用相应的构造函数
-
结构在声明时实际上就为整个结构在栈中分配了内存。例如有一个结构为Point,里面有两个数据成员x,y。可以这样使用,Point a;a.x = 3;a.y = 4;
-
结构在使用前必须初始化里面的所有数据,而结构的默认构造函数提供这个功能
-
对于大的结构,在作为参数传递给方法时,最好使用引用,因为数据的复制会给性能带来损失
6、部分类
部分类的使用partial关键字。把partial放在class、struct或interface关键字的前面