日泽IT笔记系列1-Beginning C# Objects 从概念到代码-1

来源:互联网 发布:sketch有windows版吗 编辑:程序博客网 时间:2024/05/17 06:41

  《Beginning C# Objects 从概念到代码》 自去年9月份买了这本书,正好一年了,将里面自己认为是重要的话语摘录了下来。

同时也庆祝我的第一篇博客日志的诞生。

1 A Little Taste of C#

.NET Framework是全新的革命性应用开发和运行环境管理平台,支持超过20种语言。

.NET Framework的核心要素之一是公共语言运行时CLR),它负责管理C#程序的运行环境,装载和运行C#程序,并为C#程序提供支持服务。

CLS定义了所有.NET 语言都必须遵守的公共类型集和操作,让开发者能够把C#代码和使用其他语言编写的代码无缝集成在一起。

FCL提供了在Windows平台上开发应用程序所需的几乎所有功能性元素。

C#语言是彻底的面向对象语言。

名称空间是一系列预定义C#编程元素的逻辑组合。

注释: /*  C风格 */  ,  // C++风格

预定义类型

C#是强类型的编程语言, 声明变量时必须同时声明其类型。声明变量类型的作用之一,是让编译器知道需要为变量分配多少内存空间。

C#.NET Framework使用公共类型系统CTS)一种定义一系列类型和类型操作的规范。CTS定义了许多种类型,它们被分作两种族类——值类型引用类型

String是引用类型,string类型变量表示一系列Unicode字符。

为了明确告诉C#编译器我们愿意接受精度损失(narrowing conversion时),必须进行显式转换,把表达式值转换为括号里的目标类型。

Widening conversion会自动进行。

只有一种C#简单类型不可以转换到并一种类型,那就是bool类型。

If ( condition ) {     }  else {     }

switch ( int or string expression ) { case value1: break; case value2: break; default: break; }

switch 不会自动终结。

for ( initializer; condition; iterator ) { //conditiontrue时要执行的代码 }

如果在循环开始是并不知道到底要执行多少次代码,最好使用while语句。

While (condition) {    }

do {  } while(condition)

跳出语句 break 语句可以用来中止do, for, whileswitch 循环。Continue语句用于退出循环中的当前执行体,而不结束整个循环。 Return语句通常用来退出一个方法,执行控制权返回给最近的调用者。如果方法返回类型为void,则return语句是可选的;非void,必须有至少一个的return语句。

转义序列(escape sequence), 让我们能在string表达式中表示特殊字符。

2 Abstraction and Modeling

抽象 识别和关注状况或物体的重要特征,淘汰掉所有非本质信息。

建模 是为创造某种物体而打造式样的过程。

       为将搭建的系统构造抽象方案的过程。

3 Objects and Classes

3.1 什么是对象

对象是面向对象(Object-Oriented,OO)系统的基本构成块。

所谓(软件)对象,是一种将状态(数据)和行为(操作)合成到一起的软件构造,用来描述真实世界的一个(物理或概念性的)对象。

用于描述一个对象的数据元素,被称之为对象的attribute

对象的行为或操作(operation,定义为用以访问对象的attribute(数据)和修改/维护attribute值的方法。

3.2

抽象模型中的“类”,描述了一组相似对象的共同特性。

类定义以下要素:

定义该类的对象所需要的数据结构(attribute的名称和类型);

这些对象要执行的操作,尤其是有哪些操作,类的对象如何被调用执行这些操作,以及对象执行这些操作时的“后台动作”。

术语“特征(feature)”是普通OO意义上的,“成员member)”则是C#的特定术语,用来描述类的attribute和方法。

3.3 实体化

实体化Instantiation)指对象在类声明基础上被创建(构造)的过程。

对象,也可以说成是特定类的实体(instance

类定义特征—attribute,方法等,可以把类看作对象模板(template)。

对象是模板的单一实体, attribute值已经给出,方法可以被调用。

3.4 用户自定义类型和引用变量

声明用户自定义类型的变量表示一个该类对象的符号,懂得如何响应该类所定义的一系列不同服务请求。

引用变量:指向用户自定义类型类的一个实体的变量。

当声明一个用户自定义类型变量的时候,并没有在内存中真的创建对象,而只是声明了该类类型的引用变量。必须通过特别的C#操作符—new,来真正地在内存中创造一个全新的该类对象。并把新对象和引用变量关联起来。 如:Student y=new Student( );

同一个对象可以同时被多个引用变量所指向, 但每个引用变量在固定时刻只能指向一个对象。

内存回收失败是C++程序问题的一种痼疾,CLR会定时执行垃圾回收操作,自动回收丢失了的对象所占据的内存。

是否应该创造用来表示真实世界概念/抽象模型的用户定义类型/类,并非简单的决定。

3.5 合成(Composition

当创建一个类,该类的一个或多个attribute指向另外的对象,则我们是在应用一种被称作“合成”的OO技术。对象互相内嵌的层次是无限制的,合成技术让我们可以对非常复杂的真实世界概念建模。但真正的对象内嵌无意义。 这种情况下,句柄成了救星。

通过这种方法,每个对象只在内存中被创建一次,在需要的时候,通过对象句柄引用。

使用句柄,可以避免数据冗余和数据丢失的潜在可能,也能够减少内存开支。保存一个对象的引用(或称对象的内存地址)只需要4个字节(在32位计算机上)或8个字节(在64位计算机上)的内存空间。

把一个类的attribute定义为其它类的句柄,这样,对象就能正确封装自身信息,但仍可在必要是互相联络和共享信息。

3.6 面向对象编程语言的三要素

真正的面向对象语言,支持以下三种关键机制:

1. (程序员创建的)用户自定义类型 User-defined type

2. 继承 Inheritance

3. 多态 Polymorphism

3.7 命名惯例

1. Pascal casing: 类,方法,常量,公共attribute名称(如:public string Major; ),公共的静态attributepublic static int Importantvalue

2. Camel casing: 变量名,非公共attribute(如:private string name; ),非静态属性和引用变量(指向用户自定义类型类的一个实体的变量,如:Student student;,非公共的静态attributeprivate static string name

 

4 Object Interactions

4.1 声明方法

方法头 是关于如何调用该方法的正式说明。

方法体中的逻辑定义了抽象模型的业务逻辑(business logic),业务逻辑也称为业务规则business rules)。

我们使用一个“点符号dot notation)”来把引用变量和方法头“粘”到一起,构成消息message)。

消息也可以当作表达式,如:public string GetAdvisorName( ) { return advisor.GetName( ); }

参数(parameter)本地变量,在方法头中声明,如: public void Foo(int bar),当方法被调用,名为barint型变量出现了,并被初始化为调用代码中传入的参数值(argument),如x.Foo(3)

4.2 方法签名

对于调用方法的代码来说,方法的返回类型和参数名并非一目了然。所以我们用方法签名(methods signature 시그너처)来指代方法头中可被调用代码所“发现”的方面:方法名,传入参数的类型、顺序和数量。如:方法头,int GetAge(bool ageType);方法签名,GetAge(bool)

4.3 信息隐藏(information hiding)/可访问性

在设计得很好的面向对象应用程序中,对象向外公开它能做的事—即它可以提供的服务或方法头—但会隐藏执行这些服务的内部细节,和用于支持这些服务的数据(attribute),这样对象就能保留其数据的最高控制权(好的OO编程习惯是提供公开的访问器,让客户代码有效地操作选择的私有attribute)。

可访问性accessibility)指称一个对象的特征或叫成员(attribute或方法)是否能在声明它的类以外被访问的情况。

可访问性类型:public(公共;能为其他任意类中的方法代码使用点符号来访问)、 private(私有;不能在其被声明的类之外被访问)、 protected(受保护)、 internal(内部)和protected internal(内部受保护)。

在声明成员时没有明确指定其可访问性,则会有默认值 private

实现访问气的两种方法:

一.        OO编程语言普通手法:提供取值(get)和赋值(set)方法。

public string GetName( )  {  return name;  }

public void SetName( string newName )  {  name =newName;  }

从客户代码访问attribute s.SetName(kimiltaek);

二.        C#的首选方法,使用property语言构造伪装的访问器逻辑,好让从客户代码看来,似乎是在访问一个公共attribute

private string name;

public string Name { get { return name; } set { name=value; } }

从客户代码访问attribute s.Name=kimiltaek;  就像访问公共的attribute

注: 一个property的名称应与其关联attribute的名称相符,并以大写字母开头;类型必须与其关联attribute类型一致;不必为取值访问器声明返回类型;赋值访问器自动取得名为value的单个参数。

4.4 封装的威力

封装是一种把对象的状态信息(attribute)和行为(方法)绑到一起的机制,把对象看做是“保卫”数据的要塞。

根据限制通过公共访问器访问对象的私有attribute,我们可以得到以下好处。

1. 避免对封装数据的未经授权访问;

2. 帮助确保数据完整性;

3. 当类的私有实现必须修改时,限制在整个应用程序内导致的连锁反应(只要将改动限定于类的私有特征—私有attribute和访问器代码,而不去改动公共方法/property头—连锁反应就不成其为问题了)。

4.5 实体构造器

Student x = new Student( );

括号意味着在通过new操作符实体化一个对象时,的确调用了一种特殊的函数成员,它被称作实体构造器instance constructor),实体构造器分配足够的程序内存,用来容纳对象的attribute,从而构造(实体化)一个全新对象。

如果没有明确地为一个类声明其实体构造器,C#就会自动为它提供一个缺省的无参数实体构造器,缺省的实体构造器将把类的attribute初始化为其类型中等价于零的值。

编写我们自己的构造器:

public class Student

{

   private string name;

   private string ssn;

private string major;

//构造器的名称必须与类一致;不能指定返回类型;

//与方法一样可以指定参数;与方法不同,不用点符号来调用。

   public Student( string s, string n, string m ) {

     Name=n;   //或无参数时将attribute值初始化为任意值,如:name=kimiltaek;

     Ssn=s;

     Major=m;

//可以在构造一个Student对象时做任何合理的事,如:

//创建额外的对象;访问数据库;与现存对象通讯;等等!

   }

}

向构造器传入参数:

1.  先创建,后传入;

Student s = new Student( );

s.Name=kimiltaek;

s.Ssn=010-4100-9492;

s.Major=Computer Sencience and Technology;

2.  在调用构造器时,一次性为选中的attribute传入初始值;

Student s = new Student(kimiltaek, 010-4100-9492, Software Engineering);