第六章 类型和成员基础
1. 类型的各种成员
System.Runtime.CompilerServices.InternalsVisibleToAttribute(string assemblyName)指定通常仅在当前程序集中可见的类型对指定程序集可见.指定友元程序集.assemblyName包含程序集名字和公司公钥.
接口类型必须是Public.如果没有显示声明成员的可访问性,编译器会默认为Private,限制最大的那个.
子类重写基类的方法时,只能放宽访问限制,不能缩小.但C#要求两者必须是一样的.是因为CLr承诺派生类总是可以转型为基类,并获取基类方法的访问权,如果在派生类中进行了更严格的限制了,CLR的承诺就无法兑现了.
2. 分部类
C#编译器提供一个partial关键字,以允许将一个类、结构或接口定义在多个文件里。在编译时,编译器自动将类、结构或接口的各部分合并起来。这仅是C#编译器提供的一个功能,CLR对此一无所知。
3. CLR调用虚方法虚方法
call指令一般调用静态方法和非虚的方式调用虚方法. (非虚的方式就是直接调用).此指令假定对象不是null.
callvirt一般调用非虚实例方法,和虚方法.在调用前会检查对象时否为null.如果为null会抛出NullReferenceException.
调用虚方法的速度比比调用非虚方法的速度慢.
编译器调用由值类型定义的方法时,会倾向于使用call指令.