第三章 对象与类型
1、类是存储在堆上的引用类型,而结构是存储在堆栈上的值类型。
2、在语法上类与结构非常类似,主要的区别是结构使用struct,而类使用class。
3、类的数据成员包括字段、常量与事件;函数成员包括方法、属性、构造函数和终结器、运算符以及索引器。
4、在方法调用中,对字符串所作的任何改变都不会影响原来的字符串。
5、如果把一个参数传递给方法,且这个方法的输入参数前带有ref关键字,则该方法对变量所作的任何改变都会影响原来对象的值。 在调用该方法时,还需要添加关键字ref。与ref不同,使用out传入的变量则不需要初始化。
6、C#不支持默认参数。C#重载方法时,不能仅在返回类型上有区别,不能仅根据参数是声明为ref还是out来区分。
7、C#允许给属性的get和set访问器设置不同的访问修饰符,所以属性可以有公共的get访问器和私有的或受保护的set访问器。但在get和set访问器中,必须有一个具备属性的访问级别。
8、JIT编译器可生成高度优化的代码,并在适当的时候内联代码。但注意,在何处内联代码的决定完全由CLR决定。
9、如果提供了带参数的构造函数,编译器就不会自动提供默认的构造函数,如果试图使用无参数的构造函数去实例化一个对象,就会得到一个编译错误。
10、静态构造函数至多运行一次,通常在第一次调用类的成员之前执行;主要用来需要在第一次使用类之前,从外部源中初始化这些静态字段和属性。静态构造函数没有访问修饰符,在加载类时,总是由.NET运行库来调用它。静态构造函数不能带任何参数,一个类只能有一个静态构造函数。无参数的实例构造函数可以与静态构造函数安全共存,尽管参数列表是相同的。如果多个类都有静态构造函数,先执行哪个静态构造函数是不确定的。
11、构造函数初始化器在构造函数之前执行。
class Car
{
private string description;
private uint nWheels;
public Car(string model, uint nWheels)
{
this.description = model;
this.nWheels = nWheels;
}
public Car(string model):this(model, 4)
{
}
}
C#构造函数初始化符可以包含对同一个类的另一个构造函数的调用,也可以包含对直接基类的构造函数的调用。
12、readonly关键字比const灵活得多,允许把一个字段设置为常量,但可以执行一些运算,以确定它的初始值。readonly字段只能在构造函数中初始化,而不能在其他地方赋值。只读字段可以是一个实例字段,而不是静态字段,类的每个实例可以有不同的值。与const字段不同,如果要把只读字段设置为静态,就必须显式声明。在构造函数中不必给只读字段赋值,如果没有赋值,它的值就是数据类型的默认值,或者在声明时给它初始化的值。
13、结构是值类型,所以new 运算符与类和其他引用类型的工作方不同。new运算符并不分配堆中的内存,而是调用相应的构造函数,根据传递给它的参数,初始化所有的字段。对于结构,可以使用下述代码:
Dimentions point;
point.Length = 3;
point.Width = 6;
结构遵循所有数据类型的规则:在使用前所有的元素都必须进行初始化。
如果把结构作为参数来传递或把一个结构赋给另一个结构,结构的所有内容就被复制,而对于类,则只复制引用。
不能从结构中继承,惟一的例外是结构派生于类System.Objec。在结构中,甚至可以重写System.Object的方法。
C#的结构中不能定义无参数的的构造函数。
不能绕过构造函数为字段赋初值,如下代码会产生编译错误。如果未调用构造函数初始化字段,则字段值默认为0。
struct Dimension
{
public doulbe Length = 1;
puble double Width = 2;
}
14、partial关键字的用法是:把partial放在类、结构或接口前面。在声明类时使用了如privat、internal、abstract、sealed、基类等关键字,则这些关键字将应用于同一个类的所有部分。部分类编译时,会合并属性、XML注释、接口、一般类型的参数属性和成员。
15、如果类只包含静态的方法与属性,该类就可以是静态的。静态类在功能上与使用私有静态构造函数创建的类相同,不能创建静态类的实例。静态类如果添加了实例成员,就会生成一个编译错误。
16、如果定义类时没有指定基类,编译器就会自动假定这个类派生于Object。
17、System.Object中定义的方法如下:
18、不能在结构中定义析构函数。只能对类使用析构函数。一个类只能有一个析构函数。无法继承或重载析构函数。无法调用析构函数。它们是被自动调用的。析构函数既没有修饰符,也没有参数。