现在的位置: 首页 > 综合 > 正文

《C#图解教程》读书笔记第6章——类进阶

2013年08月05日 ⁄ 综合 ⁄ 共 3185字 ⁄ 字号 评论关闭

      

这本书讲解
C#
语言十分详细,我将其中的重要内容整理成条款,以备忘。

 

1.      


类成员声明的顺序:
[
特性
] [
修饰符
]
核心声明。特性和修饰符在各自范围内都可以以任意顺序放置。

 

2.      


类的静态字段
被类的所有实例

共享
所有实例
都访问同一内存位置


 

3.      


实例成员在实例被创建时开始存在,当实例被销毁时停止存在。如果静态字段有初始化语句,那么该字段在类的任何静态成员被使用之前

初始化。


 

4.      


静态函数成员不能
访问实例成员
,但可以访问其他静态成员


 

5.      


用于初始化成员常量的值在编译期必须是可计算的
,通常是预定义类型或由它们组成的表达式,如:

enum

string

int

float


struct

class
等不行
,声明的同时必须初始化
,其后不能对其再赋值。


 

6.      


成员常量隐式为静态的

,所以不能显示声明为

static
,它们对类的每个实例都是“可见的”,在类外部需使用类名去访问,但成员常量没有自己的存储位置
,它们在编译时被编译器替换,被硬编码到程序集中

(
类似于
C/C++

#define
)


 

7.      


属性
get
访问器必须包含一条
return
语句,返回一个属性类型的值。
set

get
的顺序可任意。属性与和它相关联的字段有几种命名约定,如:字段使用
Camel
大小写
(
首字母小写
)
或下划线
+ camel
,属性使用
Pascal
大小写。

 

8.      


属性的两个访问器必须至少定义一个,否则会产生编译错误。属性并非必须和字段关联,也可以类似方法做一些其他操作,如:

Class  MyClass

{

private  int a=3, 
int b=4;

           public  int 
Op             //

只读属性

           {

                    get {return
Math.Sqrt((a * a) + (b * b));}

}

}

 

9.      


和属性关联的字段叫做后备字段,编译器不会为属性分配内存,而是将数据保存到后备字段,对后备字段进行读写。

 

10.  


C# 3.0
增加了自动实现的属性:允许只声明属性而不声明后备字段
,编译器会根据属性的类型分配存储空间;编译器将创建一个私有的匿名后备字段,该字段只能通过属性的

get


set

访问器进行访问。访问器的方法体只能声明为分号,必须同时声明
get

set
访问器。若要创建
readonly
的自动实现属性,需要将它的
set
访问器设为
private
。这样,当属性中不需要其他逻辑时,自动实现的属性可以使属性声明变得更加简洁。

 

11.  


属性也可以声明为
static
但只能访问

static
字段


 

12.  


实例构造函数在类的每个新实例创建的时候执行,如果希望能从类的外部
创建类的实例,需要声明为

public

new
运算符使用类的构造函数之一去创建类的实例。

 

13.  


如果程序员定义了一个或多个
构造函数,则编译器将不会为该类定义默认构造函数。


 

14.  


静态构造函数初始化类层次的项目,这发生在任何静态
成员被引用之前
,任何类的实例
成员被创建之前
,如类的静态字段。如果类中包含

Main

方法

则该类的静态构造函数将在调用


Main

方法之前

执行

。一个类中只能有一个

静态构造函数,而且不能带参数
,也不能有访问修饰符,因为它是私有



 

15.  


静态构造函数不能访问
所在类的实例
成员,也不能使用

this
访问器。系统会自动调用静态构造函数,所以不能显示调用
,静态构造函数不可被继承


 

16.  


如果类中含有带初始化式的静态字段,则在执行该类的静态构造函数时,会首先按照文本顺序执行那些初始化式。如果没有编写静态构造函数,而类中包含带有初始化式的静态字段,那么编译器会自动生成默认的静态构造函数。

 

17.  


C# 3.0
增加了对象初始化列表
(
对象初始化器
)
,允许在创建新的对象实例时设置字段和属性的值,有
2
种形式:一种包括构造函数的参数列表,另一种不包括。被初始化的成员在创建对象的代码

(
大多是在类的外部
)
中必须是可访问的
(

public)
,成员初始化在构造函数完成之后发生。

 

18.  


析构函数在类的实例被销毁之前
清理或释放
托管资源。析构函数只对类的实例起作用
,没有静态析构函数,不能显示地调用析构函数,析构函数会带来性能上的损耗,而且只应该释放对象自己的外部非托管资源,不应该访问其他对象

,因为无法确定这些对象是否已被收集。只有实例才有析构函数。



 

19.  


CLR
的垃圾收集器在对象从托管堆中被移走之前的某点

调用析构函数,但不能确定具体时间,如果代码包含需要及时清理的非托管资源

,应采用标准模式,在类中实现

IDisposable
接口,接口中清理资源的代码封装在一个
Dispose
方法中,
Dispose
方法需要程序员手动去调用,系统不会自动去调用它。

 

20.  


在实现
Dispose
方法的类中要声明一个布尔型字段以弄清清理是否已经发生,在
Dispose
方法中应当调用
GC.SuppressFinalize()
方法,该方法告诉
CLR
不要调用该类的析构函数。具体示例参看
6.12节的代码。

 

21.  


readonly
字段可以在声明时设置它的值,如同
const(

const
只能在字段的声明中进行初始化
)
,另外还可以在类的任何构造函数

,如果是

static
字段,初始化不许在

static
构造函数中完成


 

22.  


const
字段的值必须在编译期决定,而
readonly
字段的值可以在运行期决定,因此可以在不同
的构造函数中设置不同
的值


readonly
字段既可以是实例字段,也可以是静态字段,它在内存中有存储位置。

 

23.  


this
关键字在类中使用,是对当前实例的引用,只能用在实例
构造函数、实例
方法、属性和索引的实例访问器。

this
通常用来区分类的成员和本地变量或参数以及作为调用方法的实参。在方法内使用
this
引用字段,以区分相同名字的参数。

 

24.  


属性允许使用索引访问类实例的字段,好像该实例是字段的数组一样。和属性一样,索引不用分配内存来存储,数据保存在相关联的实例的字段。

 

25.  


索引可以想象成是提供获取和设置类的多个数据成员的属性,索引本身可以是任何类型的,但应至少有一个访问器,而且不能声明为
static
。索引实现
get

set
的代码并非一定要关联到一个类的某个字段或属性,可以做任何事情或什么也不做,只要
get
返回某个指定类型的值即可。

 

26.  


索引没有名称,在名称的位置是关键字
this
,参数列表在方括号中间,且必须至少声明一个
参数。在

get

set
中的代码必须检查索引参数,它们所使用的参数列表和索引声明中的相同。类中重载
的索引必须有不同的参数列表


 

27.  


属性和索引
(
都是函数成员
)
在默认情况下,成员的两个访问器有和成员自身相同的访问级别。如果一个成员的两个访问器都存在时,其中的一个
访问器可以设置访问修饰符,但要注意:访问器的修饰符必须比成员的访问修饰符级别更高


 

28.  


类型修饰符
partial
不是关键字,在其他上下文中,可以在程序中把它用作标识符,但直接用在关键字
class

struct

interface
之前时,它表示分部类型。类似的上下文关键字可参见
P12

2-4


 

29.  


分部方法是在分部类中声明在两个部分中的方法,分部方法有两个部分:定义部分,实现部分。定义部分给出签名和返回类型加一个分号,实现部分同正常的方法定义一样。

 

30.  


分部方法的返回类型必须为
void
,它的两个部分必须都包括
partial
,直接放在
void
之前,分部方法是隐式私有
的,不能有包括访问修饰符
不能包含

out
参数
。可以有定义部分而没有实现部分,但如果有分部方法的实现,则必须有定义部分。可参见
P106
的代码
Add
方法。

 

抱歉!评论已关闭.