《C#2.0程序设计》读书笔记

《C#2.0程序设计》读书笔记

1、  命名空间是 C# 代码的基本组织形式,类、结构等各种类型定义都包含在命名空间中,而一个命名空间也可以嵌套在另一个命名空间之中,这就形成了一个逻辑上的层次体系结构。一个程序集中可以包含多个命名空间,但每个命名空间只能属于一个程序集。

2、  C# 中,严格地说,字符类型( char )也是一种整数类型, C# 编译器负责在规定范围的整数和字符之间进行转换。由于采用了 Unicode 字符集, C# 中单个汉字也可以作为字符来使用,如 char a =’ ’;

3、  结构是值类型,而类是引用类型;对于值类型,每个变量直接包含自身的所有数据,每创建一个变量,就在内存中开辟一块区域;而对于引用类型,每个变量只存储对目标数据的引用,每创建一个变量,就增加一个指向目标数据的指针。

4、  如果一个类同时继承了接口和其他的类,定义时需要将基类写在前面,接口写在后面。接口定义中对方法的声明,既不包括访问限制修饰符,也不包括方法的执行代码。

5、  子类型到父类型进行显示转换,父类型到子类型进行隐式转换。装箱转换:实现了从值类型到引用类型的隐式转换,其中包括从任何值类型到 System.Object 类型的转换,以及从某个值类型到它所实现的接口类型的转换;拆箱转换:实现了从引用类型到值类型的显示转换,其中包括从 System.Object 类型到任何值类型的转换,以及从某个接口类型到继承借口的某个值类型的转换。编译器对显示转换并不进行检查,一旦转换失败,程序就会中止并抛出一个 System.InvalidCastException 异常。

6、  要使一个方法能够接受不同数量的参数,就要用到数组型参数。数组型参数的使用有严格的规定:方法中只允许定义一个数组型参数,而且该参数必须位于参数列表中的最后;数组型参数所定义的数组必须是一维数组;数组型参数不能同时既为引用型参数又为输出型参数。传递给数组型参数的实参可以是一个数组变量,也可以是多个数组元素变量。前者采用引用传递(方法执行代码对形参的修改同时也改变了实参),而后者采用值传递的方式(方法执行代码对形参的修改不会影响到实参)。

7、  C# 中的方法可以接受的参数类型共有 4 种:普通参数;引用型参数,以关键字 ref 定义,采用引用传递;输出型参数,以关键字 out 定义,采用引用传递,其实参可以不进行初始化;数据型参数,以关键字 params 定义,根据实参形式选择引用传递或值传递,包含数量可变的参数。

8、  对于在命名空间下直接定义的类型(如类、结构、接口、枚举、代表等),不允许使用 private 修饰符。如果成员未加任何访问限制修饰符,则默认均为 private Protected 修饰符只能用于类的成员,而对结构的成员以及在命名空间下直接定义的类型无效。 Public internal 可以作为程序集层次上的访问限制修饰符, public 的访问限制级别低于 internal ;而 public protected private 三者可以作为类型层次上的访问限制修饰符,且限制程度由低到高。

9、  在类的继承层次中,要求派生类的访问限制级别不能低于基类的访问限制级别。也就是说,如果某个基类的访问限制修饰符为 internal ,那么它的所有派生类都不能使用 public 来作为修饰符。 C# 对于成员访问限制的一个要求是:对方法参数类型的访问限制级别不能高于对方法的访问限制级别。比如: protected void SendMail(Address TargetAddress) ,而 Address 的访问级别为 private ,使用了 Address 作为参数,那么编译时就会发生错误。

10、              实例成员,属于类型的实例所有;静态成员,属于类型本身所有。和实例成员不同,使用静态成员时,圆点连接符的前面不再是某个具体的对象变量,而是类的名称。对于实例字段,每创建一个类的实例,都在内存中开辟了一块区域用于存储该字段;而类的静态字段属于类所有,为这个类的所有实例所共享,无论为这个类创建了多少个对象,一个静态字段在内存中只占有一块区域。 Static Variable ,从创建类或结构的第一个实例开始,静态变量开始存在,以后增加的实例都将共享着一变量,直至类或结构的所有实例都从内存中清楚,相应的静态变量才被清楚。

11、              类的静态构造函数只被调用了一次,而非静态的构造函数则在创建每个对象时都被调用。在创建类的第一个实例时,首先是将字段定义时的初始值赋予该字段(如未指定初始值则赋予其类型的默认值),然后调用类的静态构造函数,最后调用类的非静态构造函数。

12、              对于所有的复合赋值操作符,只要其左部操作符是可重载的二元操作符,并且操作符重载的返回类型可以隐式地转换为当前类,那么相应的赋值操作符也被隐式重载;被重载的操作符也是一种特殊的方法,且必须被声明为公有的和静态的。重载一元操作符时需提供一个参数,且参数类型应为当前类型,或者是可以隐式转换为当前类型;重载二元操作符时需提供两个参数,且至少有一个参数类型应为当前类型,或者是可以隐式转换为当前类型。

13、              C# 中,大多数情况下,派生类不会一成不变地继承基类中的所有成员,例如,。可能希望在某些字段中存储不同的信息、在某些方法中执行不同的操作等。这时就需要通过 new 关键字来隐藏基类中的成员。

派生类的构造函数对基类构造函数的调用是自动的,因此基类构造函数 base ()不允许在代码中显示地使用,而只允许标注在派生类构造函数的声明体之后。 Public Father():base( )

{

  Console.WriteLine(“ 调用 Father 的构造函数 ”);

}

错误:

Public Father( )

{

Base();

Console.WriteLine(“ 调用 Father 的构造函数 ”);

}

14、              密封类是指不允许有派生类的类,而密封方法则是指不允许被重载的方法。密封方法所在的类不一定是密封类,而如果该类存在派生类,那么在派生类中就必须原封不动地继承这个密封方法。接口的任何派生类型(包括类和接口)都必须继承该接口定义的所有方法,而抽象类的任何派生类都必须继承该抽象类定义的所有抽象方法;

 

你可能感兴趣的:(《C#2.0程序设计》读书笔记)