C#语言基础(类)

本文详细介绍了C#中的类,包括类的声明、成员(常数、字段)、构造函数和析构函数。讲解了类的访问修饰符、常数声明、字段声明、实例和静态构造函数的用法,以及析构函数的作用。通过实例展示了如何初始化类的成员和调用构造函数,强调了自定义构造函数后系统不再提供默认构造函数这一重要点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

### 一、类的声明

类是一种较为高级的数据结构,它定义了数据和操作这些数据的代码。定义一个类,与定义变量和数组类似,首先要进行声明。

**语法形式****:**

```
[属性集信息]  [类修饰符]  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所示 

![1631427561059](C:\Users\86172\AppData\Roaming\Typora\typora-user-images\1631427561059.png)

### 三、构造函数

#### 1.实例构造函数

**声明格式:**

```
[属性集信息] [构造函数修饰符] 标识符 ( [参数列表] ) 
[: base ( [参数列表] ) ]   [: this ( [参数列表] ) ] 
{
    语句块
}
```

其中:

v 构造函数修饰符——public、protected、internal、private、extern。

v 标识符([参数列表])——即构造函数名,必须与其所在类同名。

构造函数不声明返回类型,并且没有任何返回值。它与返回值类型为 void 的函数不同。构造函数可以没有参数,也可以有一个或多个参数。

【例**2.18**】 [构造函数初始化。](【例2.18】 构造函数初始化.txt)

实例对象创建时,根据不同的参数调用相应的构造函数完成初始化。

运行结果如图2.27所示 。

![1631427621289](C:\Users\86172\AppData\Roaming\Typora\typora-user-images\1631427621289.png)

上例中声明了一个类 Point,它提供了两个重载的构造函数:一个是不带参数的函数,另一个是带有两个 double参数的函数。如果类中没有定义这些函数,那么 CLR 会自动提供一个默认的构造函数。但是,一旦用户在类中自定义了构造函数,系统就**不再提供**默认构造函数—这一点需要特别注意,否则系统编译会报出错。

例如,将上例中的Point类的构造函数public Point()注释掉,如图2.28中所标注的部分,编译时则会出现图2.28中下方错误列表中的错误信息。

![1631427639165](C:\Users\86172\AppData\Roaming\Typora\typora-user-images\1631427639165.png)

#### 2.静态构造函数

**语法形式:**

```
[属性集信息]  [静态构造函数修饰符] 标识符()
{
    函数体
}
```

其中:

v 静态构造函数修饰符——[ extern ] static 或者static [ extern ]。

v 标识符( ) ——是静态构造函数名,必须与这个类同名,静态构造函数不能有参数。

v 函数体——静态构造函数的目的是对静态字段初始化,它只能对静态数据成员进行初始化,而不能对非静态数据成员初始化。

### 四、析 构 函 数

创建一个对象时需要用构造函数初始化数据,与此相对应,释放一个对象时要用析构函数,析构函数用于实现释放类实例所需操作的方法。

语法形式:

```
[属性集信息]  [ extern ] ~标识符 ( )
{
    函数体
}
```

v标识符——必须与类名相同,但为了与构造函数区分,前面需加“~”符号。

【例**2.19**】 [演示析构函数的调用次序。](【例2.19】 演示析构函数的调用次序.txt)

运行结果如图2.29所示 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值