C#入门经典 -- 8.1 什么是对象编程

       在传统的应用程序中,执行常常是简单、线性的。把应用程序加载到内存中,从A点开始执行,在B点结束,然后在内存中卸载,在这个过程中可能用到其他各种实体,例如存储介质上的文件或视频卡的功能,但处理的主体总是位于一个地方。此时的代码一般与使用各种数学和逻辑方式处理数据相关。处理方法通常比较简单,使用基本的数据类型。
       而使用OOP,事情就不是这么直接了。尽管可以获得相同的效果,但其实现方式是完全不同的。OOP技术以结构、数据的函数以及数据和数据之间的交互操作作为基础。这通常意味着要把更多的精力放在项目的设计阶段,但项目的可扩张性比较高。一旦对某种类型的数据的表达方式达成一致,这种表达方式就会应用到应用程序以后的版本中,甚至是全新的应用程序中。这种一致的表达方式可以大大减少开发时间。
       除了数据表达方式的一致外,OOP编程还常常可以简化任务,因为较抽象实体的结构和用法也是一致的。例如,不仅把输出结果发送给设备(例如打印机)所使用的数据格式是一致的,而且与该设备交换数据的方法也是一致的。

8.1.1 什么是对象
       对象是OOP应用程序的一个组成部件。这个组成部件封装了部分应用程序,这部分程序可以是一个过程、一些数据或一些更抽象的实体。
       简单地说,对象非常类似于结构类型,包含变量成员和函数类型。它所包含的变量组成了存储在对象中的数据,其中包含的函数可以访问对象的功能。略为复杂的对象可能不包含任何对象,而只包含函数,表示一个过程。
       C#中的对象是从类型中创建的,就像变量一样。对象的类型在OOP中有一个特殊的名称:类。可以使用类的定义实例化对象,这表示创建该类的一个实例。“类的实例”和对象表示相同的含义,注意“类”和“对象”是完全不同的概念。


1、属性和字段
       属性和字段可以访问对象中包含的数据。这个数据可以用于区分不同的对象。因为同一个类的不同对象在属性和字段中存储了不同的值。
       字段和属性都可以输入,所以可以把信息存储在字段和属性中,作为string变量、int变量等。但是,属性和字段是不同的,因为属性不能直接访问数据。属性可以限制输入值的取值范围,而确保输入值具有确定的意义。
       一般情况下,在访问状态下最好提供属性,而不是字段,因为这样可以更好地控制整个过程,这个选择不会影响使用对象实例的代码,因为使用属性和字段的语法是相同的。
       对属性的读写访问也可以由对象来明确定义。某些属性是只读的,只能查看他们的值,而不能改变它们(至少不能直接改变)。这通常是同时读取几个状态的一个有效的技巧。也可以通过查看几个属性,把相同的数据组合起来,但这样的属性可以节省时间和精力。还可以有只写的属性,其操作方式是类似的。
       除了对属性的读写访问外,还可以为字段和属性指定另一种访问,称为可访问性。这种可访问性确定了什么代码可以访问这些成员,它们是可用于所有代码(公共),还是只能用于类中的代码(私有),或者更复杂的模式。常见的情况是把字段设置为是私有,通过公共属性访问它们。这样,类中的代码就可以直接访问存储在字段中的数据,而公共属性禁止外部用户访问这些数据,以防止他们在其中放置无效的内容。
      要更清楚地说明这个问题,可以把可访问性与变量的作用域等同起来。例如,私有字段和属性可以看作是拥有它们的对象的局部成员,而公共字段和属性的作用域也包括对象外部的代码。


2、方法
      “方法”这个术语用于表示对象中的函数。这些函数调用的方式与其他函数相同,使用返回值和参数的方式也相同。
       方法用于访问对象的功能。与字段和属性一样,方法也可以是公共或私有的,按照需要限制访问外部代码的访问。它们常常使用对象的状态影响它们的操作,在需要时访问私有成员,如私有字段。
       注意:在UML中,方法中的每个参数带有下述标识符之一:in、out或inout。它们用于表示数据流的方向,其中out、inout大致对应于C#关键字out和ref。in大致对应于C#中不使用这两个关键字的情况。


8.1.2 所有的东西都是对象
      实际上,C#和.NET Framework中的所有东西都是对象。


8.1.3 对象的生命周期
       每个对象都一个明确定义的生命周期,除了“正在使用”的正常状态之外,还有两个重要的阶段:

  • 构造阶段:对象最初进行实例化的时期。这个初始化过程成为构造阶段,由构造函数完成。
  • 析构阶段:在删除一个对象时,常常需要执行一些清理工作,例如释放内存,这由析构函数完成。

1、构造函数
       对象的初始化过程是自动完成的。我们不需要找一个适合于存储新对象的内存空间。但是,在初始化对象的过程中,有时需要执行一些额外的工作。例如,需要初始化对象存储的数据。构造函数就是用于初始化数据的函数。
       所有的对象都有一个默认的构造函数,该函数没有参数,与类同名。一个类定义可以包含若干个带参数的构造函数,称为非默认构造函数。代码可以使用它们以多种方式实例化对象,例如给存储在对象中的数据提供初始值。
       在C#中,构造函数用new关键字来调用。
       构造函数与字段、属性和方法一样,可以是公共或私有的。在类外部的代码不能使用私有构造函数实例化对象,而必须使用公共构造函数。
       析构函数由.NET Framework用于清理对象。一般情况下,不需要提供析构函数的代码,而是由默认的析构函数执行操作。但是,如果在删除对象实例前,需要完成一些重要的操作,就应提供特定的析构函数。
       注意不能过度地依赖析构函数释放对象实例使用的资源,因为在不再使用某个对象后,该资源会长时间被该对象占用。如果所使用的资源非常重要,这样做就有可能出现问题。

8.1.4 静态和实例类成员
       属性、方法和字段等成员是对象实例所特有的,除此之外,还有静态成员(也称为共享成员),例如静态方法、静态属性或静态字段。静态成员可以在类的实例之间共享,所以可以将它们看作类的全局对象。静态属性和静态字段可以访问独立于任何对象实例的数据,静态方法可以执行与对象类型相关、但与对象实例无关的命令。在使用静态成员时,甚至不需要实例化对象。
       在许多情况下,静态属性和方法有很好的效果。例如,可以使用静态属性跟踪给类创建了多少个实例。
       在UML语法中,类的静态成员用下划线表示。
       静态类只能包含静态成员,不需要构造函数的定义,因为按照定义,它根本不能实例化。

posted @ 2008-03-29 11:39  清香的工夫茶  阅读(1145)  评论(0编辑  收藏  举报