1.基类的访问性至少要与派生类的访问性同级。

2.internal就是只能同一个文件内才能被访问。

3.值类型转换为引用类型 是装箱

   引用类型转换为值类型 是拆箱
   这个实际上就是指数据存储在堆还是栈上。

4.静态构造函数在类的一个实例创建前调用。

5.如果构造函数有初始化器,字段初始化器要在调用基类构造函数前运行。

6.虚方法是实现动态多态的根本机制。

7.编写类库文件时需要调用的函数必须声明为public static类型的才能被调用。

8.使用abstract关键字就是告诉编译器派生类必须重写这个方法。

9.分部方法有几个必受的限制:

    分部方法必须返回的void类型。

    分部方法不可以接受out参数,但可以接收ref参数。

    分部方法也不能使extern的。

    分部方法不能标记为virtual的,也不能用访问修饰符装饰,因为它们隐式是私有的

    分部方法可以用static或unsafe标记。

    分部方法可以是泛型的,并且可能有限制修饰,虽然在实现部分的声明中重复这个限制是可选的。

    委托不能调用分部方法,因为分部方法不能保证在最终编译后的代码中存在。

10.C#中的修饰符

访问修饰符:
public:存取不受限制。
private:只有包含该成员的类可以存取。
internal:只有当前工程可以存取。
protected:只有包含该成员的类以及派生类可以存取。
类修饰符:
abstract:抽象类。指示一个类只能作为其它类的基类。
sealed:密封类。指示一个类不能被继承。理所当然,密封类不能同时又是抽象类,因为抽象总是希望被继承的。
成员修饰符:
abstract:指示该方法或属性没有实现。
sealed:密封方法。可以防止在派生类中对该方法的override(重载)。不是类的每个成员方法都可以作为密封方法密封方法,必须对基类的虚方法进行重载,提供具体的实现方法。所以,在方法的声明中,sealed修饰符总是和override修饰符同时使用。
delegate:委托。用来定义一个函数指针。C#中的事件驱动是基于delegate + event的。
const:指定该成员的值只读不允许修改。
event:声明一个事件。
extern:指示方法在外部实现。
override:重写。对由基类继承成员的新实现。
readonly:指示一个域只能在声明时以及相同类的内部被赋值。
static:指示一个成员属于类型本身,而不是属于特定的对象。即在定义后可不经实例化,就可使用。
virtual:指示一个方法或存取器的实现可以在继承类中被覆盖。
new:在派生类中隐藏指定的基类成员,从而实现重写的功能。 若要隐藏继承类的成员,请使用相同名称在派生类中声明该成员,并用 new 修饰符修饰它。
至于顺序一般来说都是 
访问修饰符+类修饰符 和 访问修饰符+成员修饰符

11.类修饰符static

    这个类不能派生自System.Object之外的其他类,如果没有指定任何基类,默认派生自System.Object。

    这个类不能用作其他类的基类。

    这个类只能包含静态成员,这些成员可以是公共或私有的,但不能是proteceted或protected internal的,因为这个类不能作为基类。

    这个类不能有任何操作符,因为如果不能创建实例,定义操作符没有任何意义。

12.一个由C/C++编译的程序占用的内存分为以下几个部分 
    1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 
    2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表. 
    3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放 
    4、文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放 
    5、程序代码区—存放函数体的二进制代码.

    栈一般是保存的程序的可执行代码,一些常量等数据
    堆保存的是一些临时的数据,如函数的参数,返回值,临时申请的内存等.

13.在C#里面,用struct关键字而不是class关键字来声明一个值类型。

14.如果一个方法采用 ref参数,而另一个方法采用out参数,则无法重载这两个方法。out关键字会导致参数通过引用来传递,这与ref关键字类似,不同之处在于ref要求变量必须在传递之前进行初始化。若要使用out参数,方法定义和调用方法都必须显示使用out关键字。

15.装箱就是把值类型转换成引用类型,反之就是拆箱。被装箱的值是初始值的一个副本。这样,对箱子内的值做的所有修改不会传回初始值。可以通过接口来修改箱子内的值。

16.值类型都是存储在线程的堆栈上,而引用类型的值则在托管堆上。

17.发生装箱的时候:

    从值类型转换成对象引用。

    从值类型转换成System.ValueType引用。

    从值类型转换成指向值类型实现的接口的引用。

    从枚举类型转换成System.Enum引用。

18.protected保护成员变量或者成员函数,只能供子类和自身访问。



09-12 12:10