Static readonly vs. const

Static readonly vs. const

技术背景

在 C# 编程中,conststatic readonly 都用于定义不可变的值,但它们有不同的特点和适用场景。理解它们之间的差异,有助于开发者在不同的情况下做出正确的选择,提高代码的性能和可维护性。

实现步骤

1. const 的使用

const 用于定义编译时常量,其值必须在声明时初始化,并且在整个程序中不能更改。以下是一个示例:

1
2
3
4
5
public class Test
{
public const double Pi = 3.14;
public const int Zero = 0;
}

2. static readonly 的使用

static readonly 字段的值可以在声明时或静态构造函数中初始化,之后不能再更改。以下是一个示例:

1
2
3
4
5
6
7
8
public class Color
{
public static readonly Color Black = new Color(0, 0, 0);
public static readonly Color White = new Color(255, 255, 255);
private byte red, green, blue;

public Color(byte r, byte g, byte b) => (red, green, blue) = (r, g, b);
}

核心代码

以下是一个展示 conststatic readonly 不同行为的示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
using System;

class Program
{
const int y1 = 42;
static readonly int y2 = 42;

static void Main()
{
short x = 42;
Console.WriteLine(x.Equals(y1)); // 输出 True
Console.WriteLine(x.Equals(y2)); // 输出 False
}
}

最佳实践

  • 使用 const 的场景

    • 当值是编译时常量,并且不会在运行时改变时,优先使用 const。例如,数学常量(如 Pi)、固定的错误码等。
    • const 可以用于需要编译时确定值的场景,如 switch 语句的 case 标签、特性构造函数的参数等。
  • 使用 static readonly 的场景

    • 当值需要在运行时初始化,或者可能会在不同版本中改变时,使用 static readonly
    • 如果消费者代码在不同的程序集中,使用 static readonly 可以避免因常量值改变而需要重新编译所有客户端代码的问题。

常见问题

1. 更改 const 值的影响

如果更改了 const 的值,所有引用该常量的客户端代码都需要重新编译,否则客户端代码仍然会使用旧的值。

2. conststatic readonly 的性能差异

const 可以更快,因为它避免了方法调用,但 static readonly 在某些情况下可能会有更好的版本控制和性能表现,具体取决于使用场景。

3. 数据类型限制

const 仅限于基本类型(如整数、浮点数、布尔值)和字符串,而 static readonly 可以用于任何类型。

4. 初始化时机

const 必须在声明时初始化,而 static readonly 可以在声明时或静态构造函数中初始化。