# C零基础入门篇(9. `const` 与 `readonly` 的区别)

## 一、概述

在C#中,`const`和`readonly`都可以用来定义只读的字段,但它们在使用场景、语义和运行时行为上有显著的区别。理解它们的区别对于编写清晰、高效的代码至关重要。

## 二、`const` 的特点

### 1. **定义**

`const`用于定义编译时常量,其值在编译时必须确定,并且在运行时不能更改。

### 2. **语法**

```
public const int MyConst = 10;
```

### 3. **使用场景**

- **编译时常量**:`const`字段的值必须在编译时已知,通常用于定义固定不变的值,如数学常量、状态码等。
- **类级别常量**:`const`字段必须是静态的(即使不显式声明`static`,它也会被视为静态字段)。
- **数据类型**:可以是数值类型、字符串、布尔类型等编译时可确定的类型。

### 4. **示例**

```
public class MyClass
{
    public const int MaxValue = 100;
    public const string Version = "1.0";
}

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine(MyClass.MaxValue); // 输出:100
        Console.WriteLine(MyClass.Version);  // 输出:1.0
    }
}
```

## 三、`readonly` 的特点

### 1. **定义**

`readonly`用于定义运行时只读的字段,其值可以在构造函数中初始化,并且在运行时不能更改。

### 2. **语法**

```
public readonly int MyReadOnly;
```

### 3. **使用场景**

- **运行时初始化**:`readonly`字段的值可以在构造函数中动态初始化,适合依赖于运行时计算的只读值。
- **实例字段**:`readonly`字段可以是实例字段或静态字段,具体取决于需求。
- **灵活性**:与`const`相比,`readonly`字段的值可以在运行时确定,更灵活。

### 4. **示例**

```
public class MyClass
{
    public readonly int MyReadOnly;

    public MyClass(int value)
    {
        MyReadOnly = value; // 只能在构造函数中初始化
    }
}

class Program
{
    static void Main(string[] args)
    {
        MyClass obj1 = new MyClass(10);
        MyClass obj2 = new MyClass(20);

        Console.WriteLine(obj1.MyReadOnly); // 输出:10
        Console.WriteLine(obj2.MyReadOnly); // 输出:20
    }
}
```

## 四、`const` 与 `readonly` 的主要区别

| 特性                   | `const`                            | `readonly`                          |
| :--------------------- | :--------------------------------- | :---------------------------------- |
| **值的确定时间**       | 编译时必须确定                     | 运行时(构造函数中)初始化          |
| **是否可以修改**       | 不能修改,值在编译时固定           | 一旦初始化后不能修改                |
| **存储位置**           | 编译时直接嵌入到使用的地方         | 存储在程序集中,运行时访问          |
| **适用范围**           | 编译时常量,如数学常量、状态码等   | 运行时只读字段,依赖于动态计算的值  |
| **是否可以是实例字段** | 不可以,必须是静态字段             | 可以是实例字段或静态字段            |
| **性能**               | 稍微优于`readonly`(因为直接嵌入) | 略微逊于`const`,但差异通常可以忽略 |

## 五、最佳实践

1. **使用`const`**:
   - 当值在编译时已知且永远不会改变时,使用`const`。
   - 适用于定义数学常量、状态码、配置选项等。
2. **使用`readonly`**:
   - 当值需要在运行时动态计算或依赖于构造函数参数时,使用`readonly`。
   - 适用于需要在构造函数中初始化的只读字段。
3. **避免滥用**:
   - 不要将`const`用于可能需要动态修改的值。
   - 不要将`readonly`用于可以在运行时修改的字段。

## 六、示例代码对比

### 使用`const`

```
public class MyClass
{
    public const int MyConst = 10; // 编译时常量
}

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine(MyClass.MyConst); // 输出:10
    }
}
```

### 使用`readonly`

```
public class MyClass
{
    public readonly int MyReadOnly;

    public MyClass(int value)
    {
        MyReadOnly = value; // 运行时初始化
    }
}

class Program
{
    static void Main(string[] args)
    {
        MyClass obj = new MyClass(20);
        Console.WriteLine(obj.MyReadOnly); // 输出:20
    }
}
```

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值