<C#高级编程>第3章笔记
第3章 对象和类型
类(class)是存储于堆(heap)上的引用类型,结构(struct)是存储在栈(stack)上的值类型。
方法:类中的函数,可以是实例方法,也可以是静态方法。定义、调用、传参与Java一样。
属性(属性访问器):与访问类的公共字段类似的方式访问的函数。(类似setter和getter的一对方法)
构造函数:类似C++的构造函数及Java的构造方法。
终结器(~类名):类似于C++中的析构函数及Java中的finialize方法。
运算符:支持运算符重载。
索引器:用于排序。
函数:包括方法、构造函数、终结器等非数据成员,都可以叫作函数。
方法
引用传参:C#中指出对值参数进行引用传参,需要在值类型前面加上 ref 关键字来修饰。
多个输出:C#中默认的输入参数都必须初始化,若作为输出参数,只要在类型前面加上 out 关键字修饰,则不需要初始化,同时在方法内的任何改变都会被保留,同时,在调用该方法时也需要对参数加上 out 修饰符。
方法重载:基本类似于Java和C++。两个方法不能仅在返回类型上有区别,另外,不能只根据参数声明为ref还是out来区分。
属性
属性的命名规则:公共属性用Pascal规则,私有属性用camel规则,字段采用下划线+camel规则。
属性的访问权限:可以通过给get和set访问器不同的访问修饰符来实现。另外,不写get即为只写属性,不写set则为只读属性。
属性的访问效率:一般CLR会将其内联,因此不用考虑。与C++不同的是,C#不能自己控制函数是否inline。
构造函数
构造函数:与C++和Java类似,亦支持重载。
静态构造函数:与Java中的静态代码块相似,在类名前加上static修饰,无参,可以与无参构造函数并存。由.NET运行库在引用类之前执行。
在构造函数中调用其他的构造函数:类似C++中的方法继承,本类通过this访问,基类通过base访问,形如:
public Car(String description, uint nWheels) { }
public Car(String description): this(description, 4) { }
若采用第二个构造函数构造对象,则会先访问第一个构造函数,再访问第二个构造函数。
只读字段
通过 readonly 修饰的字段,可以一开始不给其确定值,而是在构造函数中赋值。
若在构造函数中不给其赋值,则它的值就是默认值。
结构
不支持继承,但也是object的子类,可以重写它的方法,派生于System.ValueType,可以派生多个接口。值类型。
编译器总是提供一个无参的构造函数,不允许用户提供无参构造函数。同样也不允许提供字段初始值。
用户可以指定字段在内存中的布局。
通过new关键字或分别给所有字段赋值可以初始化结构。
主要用于小的数据结构。当把它作为参数传递给方法时,为避免性能损失应当作为ref参数传递。