### 一、类的声明
类是一种较为高级的数据结构,它定义了数据和操作这些数据的代码。定义一个类,与定义变量和数组类似,首先要进行声明。
**语法形式****:**
```
[属性集信息] [类修饰符] class 类名 [: 类基]
{
[ 类主体 ]
}
```
其中:
v 属性集信息——是 C#语言提供给程序员的,可以为程序中定义的各种实体附加一些说明信息,这是C#语言的一个重要特征。
v 类修饰符——可以是表 2.10 所列的几种之一或是它们的有效组合,但在类声明中,同一修饰符不允许出现多次。
| 修 饰 符 | 作 用 说 明 |
| ------------ | ------------------------------------------------------------ |
| public | 表示不限制对类的访问。类的访问权限省略时默认为 public |
| protected | 表示该类只能被这个类的成员或派生类成员访问 |
| private | 表示该类只能被这个类的成员访问 |
| internal | 表示该类能够由程序集中的所有文件使用,而不能由程序集之外的对象使用 |
| new | 只允许用在嵌套类中,它表示所修饰的类会隐藏继承下来的同名成员 |
| abstract | 表示这是一个抽象类,该类含有抽象成员,因此不能被实例化,只能作为基类 |
| sealed | 表示这是一个密封类,不能从这个类再派生出其他类。显然密封类不能同时为抽象类 |
v 类基——定义该类的直接基类和由该类实现的接口。当多于一项时,用逗号“,”分隔。如果没有显式地指定直接基类,那么它的基类隐含为object。
最简单的类声明形如:
```
class 类名
{
类成员
}
```
例如:
```
class Point // Point类的访问权限默认为public
{
int x, y;
}
```
### 二、类 的 成 员
#### 1.常数声明
**语法形式:**
```
[属性集信息] [常数修饰符] const 类型 标识符 = 常数表达式 [, …]
```
其中:
v 常数修饰符——new、public、protected、internal、private。
v 类型—sbyte、byte、short、ushort、int、uint、long、ulong、char、float、double、decimal、bool、string、枚举类型或引用类型。
常数表达式的值类型应与目标类型一致,或者通过隐式转换规则转换成目标类型。
例如:
```
class A_const
{
public const int X=10;
const double PI=3.1416; // 默认访问修饰符,即约定为private
const double Y= 0.618+3.14;
}
```
常数表达式的值应该是一个可以在编译时计算的值,常数声明不允许使用static修饰符,但它和静态成员一样能通过类访问。
例如:
```
class Test
{
public static void Main( )
{
A_const m = new A_const ( );
Console.WriteLine ("X={0}, PI={1},Y={2}", A_const.X , A_const.PI , A_const.Y);
}
}
```
#### 2.字段声明
**语法形式:**
```
[属性集信息] [字段修饰符] 类型 变量声明列表;
```
其中:
v 变量声明列表——标识符或用逗号“,”分隔的多个标识符。
变量标识符还可用赋值号“=”设定初始值。
例如:
```
class A
{
int x=100 , y = 200;
float sum = 1.0f;
}
```
v字段修饰符——new、public、protected、internal、private、static、readonly、volatile。
【例**2.17**】 通过构造[函数给只读字段赋值。](【例2.17】 通过构造函数给只读字段赋值.txt)
程序运行结果如图2.26所示

### 三、构造函数
#### 1.实例构造函数
**声明格式:**
```
[属性集信息] [构造函数修饰符] 标识符 ( [参数列表] )
[: base ( [参数列表] ) ] [: this ( [参数列表] ) ]
{
语句块
}
```
其中:
v 构造函数修饰符——public、protected、internal、private、extern。
v 标识符([参数列表])——即构造函数名,必须与其所在类同名。
构造函数不声明返回类型,并且没有任何返回值。它与返回值类型为 void 的函数不同。构造函数可以没有参数,也可以有一个或多个参数。
【例**2.18**】 [构造函数初始化。](【例2.18】 构造函数初始化.txt)
实例对象创建时,根据不同的参数调用相应的构造函数完成初始化。
运行结果如图2.27所示 。

上例中声明了一个类 Point,它提供了两个重载的构造函数:一个是不带参数的函数,另一个是带有两个 double参数的函数。如果类中没有定义这些函数,那么 CLR 会自动提供一个默认的构造函数。但是,一旦用户在类中自定义了构造函数,系统就**不再提供**默认构造函数—这一点需要特别注意,否则系统编译会报出错。
例如,将上例中的Point类的构造函数public Point()注释掉,如图2.28中所标注的部分,编译时则会出现图2.28中下方错误列表中的错误信息。

#### 2.静态构造函数
**语法形式:**
```
[属性集信息] [静态构造函数修饰符] 标识符()
{
函数体
}
```
其中:
v 静态构造函数修饰符——[ extern ] static 或者static [ extern ]。
v 标识符( ) ——是静态构造函数名,必须与这个类同名,静态构造函数不能有参数。
v 函数体——静态构造函数的目的是对静态字段初始化,它只能对静态数据成员进行初始化,而不能对非静态数据成员初始化。
### 四、析 构 函 数
创建一个对象时需要用构造函数初始化数据,与此相对应,释放一个对象时要用析构函数,析构函数用于实现释放类实例所需操作的方法。
语法形式:
```
[属性集信息] [ extern ] ~标识符 ( )
{
函数体
}
```
v标识符——必须与类名相同,但为了与构造函数区分,前面需加“~”符号。
【例**2.19**】 [演示析构函数的调用次序。](【例2.19】 演示析构函数的调用次序.txt)
运行结果如图2.29所示