Static readonly vs. const

Static readonly vs. const

技术背景

在 C# 编程中,const 和 static 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);
}

核心代码

以下是一个展示 const 和 static 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. const 和 static readonly 的性能差异

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

3. 数据类型限制

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

4. 初始化时机

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