你必须知道的.NET

VIP免费
2025-02-27 0 0 4.59MB 333 页 5.9玖币
侵权投诉
你必须知道的.NET
作者简介:王涛 微软 C# MVP,高级软件工程师,机械工程硕士,主要研究方向为.NET 底层架构和企业级系统应
用。现就职于某软件公司负责架构设计、软件开发和项目管理方面的工作。作者对.NET 基础架构和 CLR 底层运行机
制有浓厚的研究兴趣和造诣,熟悉 ASP.NETXMLSQL Server 相关技术,对面向对象、设计模式和软件架构有一
定的研究与实践经验。
1部分 渊源——.NET 与面向对象
1 OO 大智慧
1.1 对象的旅行
2 1.1 对象的旅行
3 本节将介绍以下内容:
4 面向对象的基本概念
5 .NET 基本概念评述
6 通用类型系统
7 1.1.1 引言
8 提起面向对象,每个程序设计者都有自己的理解,有的深入肌理,有的剑走偏锋。但是无论所长,几
个基本的概念总会得到大家的重视,它们是:类、对象、继承、封装和多态。很对,差不多就是这些
元素构成了面向对象设计开发的基本逻辑,成为数以千万计程序设计者不懈努力去深入理解和实践的
根本。而实际上,理解面向对象一个重要的方法就是以实际的生活来类比对象世界,对象世界的逻辑
和我们生活的逻辑形成对比的时候,这种体验将会更有亲切感,深入程度自然也就不同以往
9 本节就从对象这一最基本元素开始,进行一次深度的对象旅行,把.NET 面向对象世界中的主角来一
次遍历式曝光。把对象的世界和人类的世界进行一些深度类比,以人类的角度戏说对象,同时也以对
象的逻辑反思人类。究竟这种旅程,会有什么样的洞悉,且看本文的演义。
10 对象和人,两个世界,一样情怀。
11 1.1.2 出生
12 对象就像个体的人,生而入世,死而离世。
13 我们的故事就从对象之生开始吧。首先,看看一个对象是如何出生的:
14 Person aPerson = new Person("小王", 27);
15 那么一个人又是如何出生呢?每个婴儿随着一声啼哭来到这个世界,鼻子是鼻子、嘴巴是嘴巴,已经
成为一个活生生的独立的个体。而母亲的怀胎十月是人在母体内的成长过程,母亲为胎儿提供了所有
的养分和舒适的环境,这个过程就是一次实实在在的生物化构造同样的道理,对象的出生也是
一次完整的构造过程:首先会在内存中分配一定的存储空间;然后初始化其附加成员,就像给人取个
具有标识作用的姓名一样;最后,再调用构造函数执行初始化,这样一个对象实体就完成了其出生的
过程,例如上例中我们aPerson 对象初始化了姓名和年龄。
16 正如人出生之时,一身赤裸没有任何的附加品,其余的一切将随需而生,生不带来就是这个意思。对
象的出生也只是完成了对必要字段的初始化操作,其他数据要通过后面的操作来完成。例如对属性赋
值,通过方法获取必要的信息等。
17 1.1.3 旅程
18 婴儿一出世,由 it 成为 he or she,就意味着从此融入了复杂的社会关系,经历一次在人类伦理与社会
规则的双重标准中生活,开始了为人的旅程。同理,对象也一样。
19 作为个体的人,首先是有类型之分的,农民、工人、学者、公务员等,所形成的社会规则就是农民在
田间务农,工人在工厂生产,学者探讨知识,公务员管理国家。
20 对象也一样是有类型的,例如整型、字符型等等。当然,分类的标准不同,产生的类别也就不同。但
是常见的分类就是值类型和引用类型两种。其依据是对象在运行时在内存中的位置,值类型位于线程
的堆栈,而引用类型位于托管堆。正如农民可以进城务工,工人也可以回乡务农,值类型和引用类型
的角色也会发生转变,这个过程在面向对象中称为装箱与拆箱。这一点倒是与刚刚的例子很贴切,农
民进城,工人回乡,不都得把行李装进箱子里折腾嘛。
21 作为人,我们都是有属性的,例如你的名字、年龄、籍贯等,用来描述你的状态信息,同时每个人也
用不同的行为来操作自己的属性,实现了与外界的交互。对象的字段、属性就是我们自己的标签,而
方法就是操作这些标签的行为。人的名字来自于长辈,是每个人在出生之时构造的,这和对象产生时
给字段赋值一样。但是每个人都有随时更名的权力,这种操作名称的行为,我们称之为方法。在面向
对象中,可以像这样来完成:
22 aPerson.ChangeName("Apple Boy");
23 所以,对象的旅行过程,在某种程度上就是外界通过方法与对象交互,从而达到改变对象状态信息的
过程,这也和人的生存之道暗合。
24 人与人之间通过语言交流。人一出生,就必然和这个世界的其他人进行沟通,形成种种相互的关系,
融入这个完整的社会群体。在对象的世界里,你得绝对相信对象之间也是相互关联的,不同的对象之
间发生着不同的交互性操作,那么对象的交互是通过什么方式呢?对象的交互方式被记录在一本称为
设计模式的魔法书中,当你不解以什么样的方式建立对象与对象之间的关系时,学习前人的经验
往往是最好的选择。
25 下面,我们简要地分析一下对象到底旅行在什么样的世界里?
26 对象的生存环境是 CLR,而人的生存环境是社会。CLR 提供了对象赖以生存的托管环境,制定一系
列的规则,称之为语法,例如类型、继承、多态、垃圾回收等,在对象世界里建立了真正的法制秩序;
而社会提供了人行走江湖的秩序,例如法律、规范、道德等,帮助我们制约个体,维护社会
27 人类社会就是系统架构,也是分层的。上层建筑代表政治和思想,通过社会契约和法律规范为经济基
础服务,在对象世界中,这被称为接口。面向接口的编程就是以接口方式来抽象变化,从而形成体系。
正如人类以法律手段来维系社会体系的运作和秩序一样。
28 由此可见,对象的旅行就是这样一个过程,在一定的约定与规则下,通过方法进行彼此的交互操作,
从而达到改变本身状态的目的。从最简单的方式理解实际情况,这些体会与人的旅程如此接近,给我
们的启示更加感同身受
29 1.1.4 插曲
30 接下来,我们以与人类世界的诸多相似之处,来进一步阐释对象世界的几个最熟悉的概念。
31 关于继承。人的社会中,继承一般发生在有血缘关系的族群中。最直接的例子一般是,儿子继承父亲,
包括姓氏、基因、财产和一切可以遗留的东西。但并不代表可以继承所有,因为父亲隐私的那一部分
属于父亲独有,不可继承。当然,也可能是继承于族群的其他人,视实情而定。而在面向对象中,继
承无处不在,子类继承父类,以访问权限来实现不同的控制规则,称为访问级别,如表 1-1 所示。
32 1-1 访问修改符
访问修饰符
访问权限
pubic
对访问成员没有限制,属于最高级别访问权
protected
访问包含类或者从包含类派生的类
internal
访问仅限于程序
protected internal
访问仅限于从包含类派生的当前程序集或类型。也就是同一个程序集的对象,或者该类及其子类可以访问
private
访问仅限于包含类型
33 这些规则可以以公司的体制来举例说明,将公司职权的层级与面向对象的访问权限层级做类比,应该
是这样:
34 public,具有最高的访问权限,就像是公司的董事会具有最高的决策权与管理权,因此 public 开放
性最大,不管是否同一个程序集或者不管是否继承,都可以访问。
35 protected,类似于公司业务部门经理的职责,具有对本部门的直接管辖权,在面向对象中就体现
为子类继承这种纵向关系的访问约定,也就是只要继承了该类,则其对象就有访问父类的权限,而不
管这两个具有继承关系的类是否在同一个程序集中。
36 internal,具有类比意义的就是 internal 类似于公司的职能部门的职责,不管是否具有上下级的隶属
关系,人力资源部都能管辖所有其他部门的员工考勤。这是一种横向的职责关系,在面向对象中用来
表示同一程序集的访问权限,只要是隶属于同一程序集,对象即可访问其属性,而不管是否存在隶属
关系。
37 protected internal,可以看做是 protected internal 的并集,就像公司中掌管职能部门的副总经理,从
横向到纵向都有管理权
38 private,具有最低的访问权限,就像公司的一般员工,管好自己就行了。因此,对应于面向对象
的开放性最小。
39 另外,对象中继承的目的是提高软件复用,而人类中的继承,不也是现实中的复用吗?
40 而关于多态,人的世界中,我们常常在不同的环境中表现为不同的角色,并且遵守不同的规则。例如
在学校我们是学生,回到家里是儿女,而在车上又是乘客,同一个人在不同的情况下,代表了不同的
身份,在家里你可以撒娇但是在学校你不可以,在学校你可以打球但在车上你不可以。所以这种身份
的不同,带来的是规则的差异。在面向对象中,我们该如何表达这种复杂的人类社会学呢?
41 interface IPerson
42 {
43 string Name
44 {
45 get;
46 set;
47 }
48 Int32 Age
49 {
50 get;
51 set;
52 }
53 void DoWork();
54 }
55 class PersonAtHome : IPerson
56 {
57 }
58 class PersonAtSchool : IPerson
59 {
60 }
61 class PersonOnBus : IPerson
62 {
63 }
64 显然,我们让不同角色Person 继承同一个接口:IPerson。然后将不同的实现交给不同角色的人自
行负责,不同的是 PersonAtHome 在实现时可能是 CanBeSpoil(),而 PersonOnBus 可能是 BuyTicket()
不同的角色实现不同的规则,也就是接口协定。在使用上的规则是这个样子:
65 IPerson aPerson = new PersonAtHome();
66 aPerson.DoWork();
67 另一个角色又是这个样子:
68 IPerson bPerson = new PersonOnBus();
69 bPerson.DoWork();
70 由此带来的好处是显而易见的,我们以 IPerson 代表了不同角色的人,在不同的情况下实现了不同的
操作,而把决定权交给系统自行处理。这就是多态的魅力,其乐无穷中,带来的是面向对象中最为重
要的特性体验。记住,很重要的一点是,DoWork 在不同的实现类中体现为同一命名,不同的只是实
现的内部逻辑。
71 这和我们的规则多么一致呀!
72 当然,有必要补充的是对象中的多态主要包括以下两种情况:
73 接口实现多态,就像上例所示。
74 抽象类实现多态,就是以抽象类来实现。
75 其细节我们将在 1.4 多态的艺术中加以详细讨论
76 由此可见,以我们自己的角度来阐释技术问题,有时候会有意想不到的收获,否则你将被淹没在诸如
为什么以这种方式来实现复用的叫喊中不能自拔。换一个角度,眼界与思路都会更加开阔。
77 1.1.5 消亡
78 对象和人,有生必然有死。在对象的世界里,它的生命是由 GC 控制的,而在人的世界里我们把 GC
称为自然规律。进入死循环的对象,是违反规则的,必然无法逃脱被 Kill 的命运,就如同没有长生
死的人一样。
79 在这一部分,我们首先观察对象之死,以此反思和体味人类入世的哲学,两者相比较,也会给我们更
多关于自己的启示。对象的生命周期由 GC 制,其规则大概是这样:GC 管理所有的托管堆对象,
当内存回收执行时,GC 查托管堆中不再被使用的对象,并执行内存回收操作。不被应用程序使
的对象,指的是对象没有任何引用。关于如何回收、回收的时刻,以及遍历可回收对象的算法,是较
为复杂的问题,我们将5.3 垃圾回收中进行深度探讨。不过,这个回收的过程,同样使我们感
慨。大自然就是那个看不见的 GC,造物而又终将万物回收,无法改变。我们所能做到的是,将生
的周期拓宽、延长、书写得更加精彩。
摘要:

《你必须知道的.NET》作者简介:王涛微软C#MVP,高级软件工程师,机械工程硕士,主要研究方向为.NET底层架构和企业级系统应用。现就职于某软件公司负责架构设计、软件开发和项目管理方面的工作。作者对.NET基础架构和CLR底层运行机制有浓厚的研究兴趣和造诣,熟悉ASP.NET、XML、SQLServer相关技术,对面向对象、设计模式和软件架构有一定的研究与实践经验。第1部分渊源——.NET与面向对象第1章OO大智慧1.1对象的旅行21.1对象的旅行3本节将介绍以下内容:4—面向对象的基本概念5—.NET基本概念评述6—通用类型系统71.1.1引言8提起面向对象,每个程序设计者都有自己的理解,...

展开>> 收起<<
你必须知道的.NET.pdf

共333页,预览5页

还剩页未读, 继续阅读

声明:本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。玖贝云文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知玖贝云文库,我们立即给予删除!
分类:计算机 价格:5.9玖币 属性:333 页 大小:4.59MB 格式:PDF 时间:2025-02-27

开通VIP享超值会员特权

  • 多端同步记录
  • 高速下载文档
  • 免费文档工具
  • 分享文档赚钱
  • 每日登录抽奖
  • 优质衍生服务
/ 333
客服
关注