以《C#6.0本质论(Essential C# 6.0)》为基本,参考《深入解析C#(C# in Depth, 4th Edition)》、《C#图解教程(Illustrated C# 7, 5th Edition)》。圆括号内是本质论书中位置、方括号是个人补充
在类实例成员内部,可以获取对这个类实例的引用(P150)
属性可以自动实现同名字段(P160)
拦截赋值,并通过字段风格的API对参数进行验证,这是属性的优点之一(P163)
属性可以作为虚字段使用【属性可以封装真实字段数据】(P166)
为赋值方法提供private修饰符后,属性对于除类之外的其它类来说就是只读的......注意该访问修饰符的“限制性”必须比应用于整个属性的访问修饰符更严格(P167)
显示构造的读和写方法(P168)
“运行时”实例化对象的方法(170)
没有返回值
声明时优先、构造器内的赋值在后,后者会覆盖前者(P170)
在构造器创建对象时,可以在后面的一对大括号中添加成员初始化列表(P171)——语法糖,生成的CIL代码和用单独的语句对字段以及属性进行赋值无异。
可以同时存在多个构造器,只要参数的数量和类型有所区别(P173)【签名】
编译器会为匿名类型生成声明中已经命名的值和属性类型对应的属性(P176)
不会为匿名类提供名称,但是匿名类仍然是静态编译(P176)
访问修饰是Internal(C# In Depth)
C#中,与全局字段或函数等价的是静态字段或方法(P177)
静态字段不从属于实例,而是从属于类(P178)
可以在类名之后直接访问静态方法,访问这些方法不需要实例(179)
this关键词【代表类的实例对象】对无法访问静态成员(P180)
“运行时”首次访问类时自动调用静态构造器。由于其不能显示调用,所以不能有任何输入参数(P180)
字段声明时的赋值被移动了位置,成为静态构造器的第一个语句【仍然满足声明赋值优先于构造器(只不过静态构造器没有传入参数、无法赋值给字段了)】(P181)
CIL代码中标记为abstract和sealed(P183)
从派生类型转化成基类型,成为隐式转型,不需要添加转型操作符。从基类型转换为派生类型,执行显式转型(P196)
要从派生类中访问受保护成员,必须在编译时确定是从派生类的实例中访问受保护成员(P199)
C#是单继承机制。......在极少数需要多继承类结构的时候,一般的解决方案是使用聚合(P200)
通过密封类防止派生(P201)
用override修饰的任何方法都自动成为虚方法
不再调用派生最远的基类型。相反,时搜索继承链,找到使用new修饰符的成员之前的成员,然后调用该成员。(P205)
可以禁止子类重写继承链中高层基类的虚成员(P208)
为了调用基类的实现,要使用base关键字。(P209)