.NET框架程序设计(修订版)-- 笔记(三)

第Ⅲ部分 类型设计

第七章     类型成员及其访问限定

7.1类型成员

       ①常数;②字段;③实例构造器;④类型构造器;⑤方法;⑥重载操作符;⑦转换操作符;⑧属性;⑨事件;⑩类型;

7.2访问限定修饰符和预定义特性P.1737.1

       private;②protected;③Internal;④protected internal;⑤public

       7.2.1类型预定义特性P.1747.2

              abstract;②sealed

       7.2.2字段预定义特性P.1757.3

              static;②readonly

       7.2.3方法预定义特性P.1757.4

①              static

②              instance;(默认)

③              virtual

④              new;(方法的子类实现不会重写基类型中的实现)

⑤              override;(重写基类虚方法)

⑥              abstract

⑦              sealed;(不能重写该方法)

第八章     常数与字段

8.1常数

       表示一个恒定不变的值的符号。总被认为是类型(而非实例)的一部分。

       基元类型和枚举类型常被用来定义为常数。

       如果要求一个模块中的数值能够在运行时(而不是编译时)被另一个模块获取,那么就不应该使用常数。我们应该使用只读字段。

       关键字:const

8.2字段

       又称为数据成员,它保存着一个值类型的实例、或者一个指向引用类型的引用。CLR支持类型(静态)和实例(非静态)两种字段。

       只读关键字:readonly

第九章     方法

9.1实例构造器

       是一个特殊的方法,它们负责将类型的实例初始化到一个良好的状态。

       创建一个引用类型的实例时:①为该实例分配内存;②初始化对象的附加成员(即方法指针和一个SyncBlockIndex);③调用类型的实例构造器设置对象的厨师状态。

       构造器没有显式赋值的字段都保证有一个0NULL的值。

       如果我们又一些需要初始化的实例字段和许多重载的构造器方法,我们应该考虑在定义字段的时候避免同时对它们进行初始化,应该将这些公共的初始化语句放在一个初始化构造器中,然后其他的构造器显式的调用这个初始化构造器。

       值类型C#不会默认产生构造器,但是允许我们为其定义构造器。只有在显式调用时会被执行。并且不允许定义无参的构造器。必须要初始化其所有的字段。

9.2类型构造器

       又称静态构造器、类构造器或类型初始化器。与实例构造器的区别:static关键字及默认private

       CLR负责进行调用,在第一个实例被创建之前或者在类型的非继承字段或成员第一次被访问之前调用,以及在非继承静态字段被第一次访问之前的某个时刻。一旦被执行,在整个应用程序域(AppDomain)的生命周期内都不会再次被调用。用于初始化类型中的静态字段,元数据标记.cctor

9.3操作符重载方法

       P.1919.1C#操作符和对应的与CLS兼容的方法名

       9.3.1操作符与语言互操作性

9.4转换操作符方法

9.5引用参数

       CLR默认所有参数是按值传递。对于所传参数进行拷贝,不会影响外部的参数的值。

按引用传递使用outref关键字实现。区别为哪个方法负责初始化参数。如果使用out那么调用代码在调用该方法之前可以不初始化该参数,并且被调用方法不能直接读取参数的值,必须在返回之前为该参数赋值。ref则相反。按引用方式传递的变量必须和方法声明的参数类型完全相同。

       9.6可变数目参数

              使用params关键字告诉编译器在制定的参数上应用一个System.ParamArrayAttribut定制特性的实例。只有方法的最后一个参数才可以使用。必须为一个一维数组,类型可以任意,传递NULL或者0长数组是合法的。

       9.7虚方法的调用机理

              CLR提供了callcallvirt指令。call根据引用变量的类型来调用一个方法,而callvirt根据引用变量指向的对象类型来调用一个方法。call会提高性能。

       9.8虚方法的版本问题

              基类子类中同时存在的未重写的方法,子类中可以使用new关键字告诉编译器该方法与基类中的方法没有关系。

第十章     属性

10.1无参属性

无参属性,通常称为属性(property);有参属性,称为索引器(indexer)

数据封装(data encapsulation)不应该将类型的字段以公有的方式提供给外界。

封装了对字段访问的方法典型地被称为访问器方法(accessor method)。可以选择执行任何的数据合理性检查来确保对象的状态不被破坏。

我们可以将属性看做是一种智能字段(smart field),因为在它们的后端有一个额外的逻辑处理。可以是静态属性、实例属性和虚属性。每个属性都有一个名称和一个类型(不能为void),属性不能被重载,同时会制定一个getset方法,通过去掉set成为只读,去掉get成为只写。

       10.2含参属性

              Get访问器接受一个 多个参数的属性,为含参属性,C#称为索引器。可以用类似数组的语法来访问。可以将索引器看做是重载[]操作符的一种方式。

第十一章     事件   -- 需要敲代码

事件(event)定义了事件成员的类型允许类型(或类型实例)在某些特定事情发生的时候通知其他对象。

定义一个事件成员意味着类型为我们提供了:

    允许对象登记该事件;

    允许对象注销该事件;

    允许定义事件的对象维持一个登记对象的集合,并在某些特定的事情发生时通知这些对象。

       CLR的事件模型建立在委托(delegate)上。

       11.1发布事件

              定义一个类型用于保存所有需要发送给事件通知接受者的附加信息;

定义一个委托类型,用于指定事件触发时被调用的方法原型;

              定义一个事件成员;

              定义一个受保护的虚方法,负责通知事件的登记对象;

              定义一个方法,将输入转化为期望的事件;

       11.2侦听事件

              使用+=操作符登记事件,-=操作符注销事件。

       11.3显式控制事件注册

       11.4在一个类型中定义多个事件

              定义一个受保护的实例集合字段;

              为类型希望提供的事件定义必要的成员。

                  .构造一个静态只读对象来标识事件。

                  .为事件定义一个继承自EventArgs的类型,该类型用于保存任何需要传递给事件接受者的附加信息。

                  .定义一个委托类型,指定事件触发时被调用的方法原型。

                  .显式定义事件及其访问器方法。

                  .定义一个受保护的虚方法,负责同志事件的登记对象。

                  .定义一个方法将输入转化为期望的事件。

              为类型希望提供的事件定义必要的成员。

       11.5设计EventHandlerSet类型

posted @ 2009-12-27 11:18  壊小子  阅读(235)  评论(0编辑  收藏  举报