《Illustrated C# 2012, 4th Edition》Daniel M. Solis 第6章 深入理解类 笔记

成员声明

类成员声明必须按特性(attribute)、修饰符、核心声明的顺序排列。

静态成员

static声明的成员是静态的。
在类和结构外部,必须使用类名和结构名才能访问静态成员。
静态字段在堆上分配内存,占所属的类和结构的内存,与它们的实例的内存分开。
静态字段在访问所属类和结构的任意静态字段时初始化。
静态函数只能访问所属类和结构的静态成员,不能访问实例成员。
类成员中,只有以下勾选的类型可以声明为静态:

常量

与C/C++不同,C#没有全局常量。
C#中常量不分配内存,在编译时替换为它的值,类似于C/C++中的宏#define。
常量成员,在类和结构外部,必须使用类名和结构名才能访问,与静态成员一样。
常量成员不能声明为static。

属性

属性是函数成员,不分配内存,有两个访问器set和get。

  1. set访问器有一个隐式的属性类型的值参数value,返回void。
  2. get访问器没有参数,返回属性类型。
  3. set与get访问器至少定义一个,只定义set访问器是只写的,只定义get访问器是只读的。

一个public属性关联一个private字段,这个字段被称为后备字段。属性与后备字段有两种常见的命名约定:

与public字段相比,属性更为推荐,提供更多的功能,更便于修改。

C#提供自动实现属性(automatically implemented property):当声明属性时,set与get访问器同时存在,并且方法体为分号时,编译器为属性创建隐藏的后备字段,这个字段只能通过这个属性访问。

构造函数

构造函数(constructor)与类名相同,没有返回值类型。
实例构造函数支持重载。
当一个类没有显式声明实例构造函数时,编译器为这个类定义默认构造函数。默认构造函数没有参数,方法体为空,被public修饰。
new关键字调用实例构造函数。
static声明的构造函数是静态的,一个类只有一个静态构造函数。静态构造函数不能有参数,不能有访问修饰符。
静态构造函数无法显式调用,当类被实例化时,或访问类的静态成员时,在这些操作被执行之前被调用。

对象初始化语句

对象初始化语句有两种形式:

对象初始化语句在构造函数之后调用。

析构函数

析构函数(destructor)用于在实例被销毁之前清理和释放非托管资源。因此,如果只使用.NET类,则不需要编写析构函数。

readonly

readonly只能修饰字段,可以是实例字段,也可以是静态字段。
readonly声明的字段,在初始化后,便不能再修改。可以通过initializer初始化,也可以在构造函数中初始化。初始值可以是运行时确定的值。
与const不同,readonly分配内存。

this

this关键字,在类中使用是对当前实例的引用。只能在以下成员中使用:

  1. 实例构造函数
  2. 实例方法。
  3. 属性和索引器的实例访问器。

this常用于区分类的成员与本地变量或参数,和作为调用方法的实参。

索引器

索引器与属性相似,但表示多个数据成员。
索引器只能实例成员,不能声明为static。
索引器没有后备字段的概念,因此也不支持自动实现属性。

索引器与属性的声明差异:

索引器的参数,至少存在一个,支持存在多个。

索引器通过类名和结构名后跟方括号,并在方括号中传递实参访问。
索引器支持重载。

访问器的访问修饰符

访问器支持访问修饰符,但存在限制:

  1. 仅当属性或索引器同时存在set和get访问器时,才能其中之一有访问修饰符。
  2. 访问器的访问修饰符必须比所属成员的的访问级别有更严格的限制性。

访问修饰符的限制性:

分部类

partial class声明的类是分部类,分部类支持将一个类的声明分割成多个部分,这些部分可以不在一个文件内。

分部方法

分部方法指将一个方法的声明拆分成两个部分,这些部分可以在分部类的不同部分中声明。

  1. 定义部分:包含签名和返回值类型,方法体为分号。
  2. 实现部分:包含签名和返回值类型,方法体与普通方法相同。

分部方法存在以下限制:

  1. 定义部分与实现部分的签名和返回值类型必须相同。
  2. 返回值类型必须为void。
  3. void之前必须为partial。
  4. 不能包含访问修饰符,分部方法是隐式private的。
  5. 不能包含out参数。

允许只存在定义部分,这样编译器将这个方法的声明和调用全部移除。
不允许只存在实现部分。

Gitalking ...