Net Core教程

C#学习笔记(3):类

本文主要是介绍C#学习笔记(3):类,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

以《C#6.0本质论(Essential C# 6.0)》为基本,参考《深入解析C#(C# in Depth, 4th Edition)》、《C#图解教程(Illustrated C# 7, 5th Edition)》。圆括号内是本质论书中位置、方括号是个人补充

this

在类实例成员内部,可以获取对这个类实例的引用(P150)

属性

自动实现

属性可以自动实现同名字段(P160)

作用

拦截赋值,并通过字段风格的API对参数进行验证,这是属性的优点之一(P163)

虚字段

属性可以作为虚字段使用【属性可以封装真实字段数据】(P166)

访问修饰符

为赋值方法提供private修饰符后,属性对于除类之外的其它类来说就是只读的......注意该访问修饰符的“限制性”必须比应用于整个属性的访问修饰符更严格(P167)

工作机制

显示构造的读和写方法(P168)

  • 属性调用不允许作为red或out参数值使用:属性可能是虚字段,也可能是只读或只写的,因此不可能传递存储地址(P168)。

规范

  • 避免从外部访问属性支持的字段(P163)
  • 不要提供只写属性(P167)

构造器

定义

“运行时”实例化对象的方法(170)

没有返回值

字段的初始化

声明时优先、构造器内的赋值在后,后者会覆盖前者(P170)

对象初始化器

在构造器创建对象时,可以在后面的一对大括号中添加成员初始化列表(P171)——语法糖,生成的CIL代码和用单独的语句对字段以及属性进行赋值无异。

重载

可以同时存在多个构造器,只要参数的数量和类型有所区别(P173)【签名】

匿名类型

编译器会为匿名类型生成声明中已经命名的值和属性类型对应的属性(P176)

不会为匿名类提供名称,但是匿名类仍然是静态编译(P176)

访问修饰是Internal(C# In Depth)

静态成员

C#中,与全局字段或函数等价的是静态字段或方法(P177)

静态字段

静态字段不从属于实例,而是从属于类(P178)

可以在类名之后直接访问静态方法,访问这些方法不需要实例(179)

this关键词【代表类的实例对象】对无法访问静态成员(P180)

静态构造器

“运行时”首次访问类时自动调用静态构造器。由于其不能显示调用,所以不能有任何输入参数(P180)

字段声明时的赋值被移动了位置,成为静态构造器的第一个语句【仍然满足声明赋值优先于构造器(只不过静态构造器没有传入参数、无法赋值给字段了)】(P181)

静态类

CIL代码中标记为abstract和sealed(P183)

类的继承

派生

转型

从派生类型转化成基类型,成为隐式转型,不需要添加转型操作符。从基类型转换为派生类型,执行显式转型(P196)

protected修饰符

要从派生类中访问受保护成员,必须在编译时确定是从派生类的实例中访问受保护成员(P199)

单继承与多继承

C#是单继承机制。......在极少数需要多继承类结构的时候,一般的解决方案是使用聚合(P200)

密封类

通过密封类防止派生(P201)

基类重写

virtual修饰符

  • C#支持重写实例方法和属性,但不支持重写字段或者任何静态成员。(P202)
  • C#不允许隐式重写(P203)
  • “运行时”遇到虚方法时,它会调用虚成员派生得最远、重写的实现。(P203)

override修饰符

用override修饰的任何方法都自动成为虚方法

new修饰符

不再调用派生最远的基类型。相反,时搜索继承链,找到使用new修饰符的成员之前的成员,然后调用该成员。(P205)

sealed修饰符

可以禁止子类重写继承链中高层基类的虚成员(P208)

base成员

为了调用基类的实现,要使用base关键字。(P209)

构造器

  • “运行时”首先调用基类的构造器,以避免绕过对基类的初始化(P209)
  • 程序员需要在派生类构造的头部显示指定要运行哪个基类构造器(P209)

抽象类

  • 其主要特征是它包含抽象成员【实现的抽象】(P211)
  • 抽象成员自动为虚成员......抽象成员不能声明为私有,否则派生类看不到它们(P212)
  • 抽象成员是实现多态性的一个手段。基类指定方法的签名,而派生类提供具体的实现(P213)

接口

  • 接口订立了契约,类必须履行这个契约(P219)
  • 接口通过声明属性,要求派生类包含特定数据(P219)
  • 接口所有成员都自动定义为公共成员(P219)
  • 显示接口可以认为是机制方面的考虑,隐式接口可以认为是模型方面的考虑(P226)
  • 拓展方法也可以用于接口(P230)
这篇关于C#学习笔记(3):类的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!