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