“readonly”和“const”关键字
本课属于 Coddy C# 学习旅程的“面向对象编程”单元。第 16 课,共 70 课。
C# 提供了两个关键字,用于创建无法更改的值:const 和 readonly。虽然它们都能防止值被修改,但工作方式不同,用途也各不相同。
const 字段必须在声明时赋值,其值在编译时确定。它隐式为静态,意味着它属于类,而不是实例:
public class GameSettings
{
public const int MaxPlayers = 4;
public const double Gravity = 9.81;
}你通过类名访问常量:GameSettings.MaxPlayers。常量只能用于基本类型、字符串和 null,因为编译器必须知道确切的值。
readonly 字段可以在声明时或构造函数中赋值,它的值在运行时确定:
public class Player
{
public readonly string Id;
public readonly DateTime CreatedAt = DateTime.Now;
public Player(string id)
{
Id = id;
}
}与 const 不同,readonly 字段可以保存任何类型的值,而且每个实例的值都可以不同。构造函数执行完毕后,值就不能再更改。
对于真正通用且永远不会改变的值,例如数学常量,使用 const。对于只需设置一次、但可能因对象而异或需要在运行时计算的值,使用 readonly。
挑战
简单让我们构建一个物理模拟配置系统,演示何时使用 const 表示通用常量,何时使用 readonly 表示在运行时设置一次的值。
你将创建两个文件来组织代码:
PhysicsConstants.cs:在Simulation命名空间中定义一个PhysicsConstants类。这个类应包含永不改变且在任何地方都相同的通用常量:- 一个值为
9.81的const字段Gravity - 一个值为
299792458的const字段SpeedOfLight - 一个值为
"m/s^2"的const字符串GravityUnit
- 一个值为
Projectile.cs:在Simulation命名空间中定义一个Projectile类。每个抛射体都有一些值,这些值应在创建时设置一次,之后不再修改:- 一个
readonly字段Name(字符串) - 一个
readonly字段InitialVelocity(double) - 一个
readonly字段LaunchAngle(double,单位为度) - 一个接受并设置全部三个值的构造函数
- 一个用于使用以下公式计算最大高度的方法
GetMaxHeight():(velocity^2 * sin^2(angle)) / (2 * gravity)。使用Math.Sin(),并通过乘以Math.PI / 180将角度从度转换为弧度
- 一个
Program.cs:在主文件中,使用输入值创建一个抛射体,并显示物理常量以及计算出的抛射体最大高度。
你将收到三个输入值:
- 抛射体名称
- 初速度(单位为 m/s)
- 发射角度(单位为度)
按以下格式输出:
Gravity: {Gravity} {GravityUnit}
Speed of Light: {SpeedOfLight} m/s
Projectile: {Name}
Initial Velocity: {InitialVelocity} m/s
Launch Angle: {LaunchAngle} degrees
Max Height: {maxHeight} m使用 Math.Round(value, 2) 将最大高度四舍五入到小数点后 2 位。
例如,如果输入值为 Rocket、50 和 45,输出应为:
Gravity: 9.81 m/s^2
Speed of Light: 299792458 m/s
Projectile: Rocket
Initial Velocity: 50 m/s
Launch Angle: 45 degrees
Max Height: 63.71 m亲手试试
using System;
using Simulation;
class Program
{
public static void Main(string[] args)
{
// 读取输入
string name = Console.ReadLine();
double velocity = Convert.ToDouble(Console.ReadLine());
double angle = Convert.ToDouble(Console.ReadLine());
// TODO: 用输入值创建一个 Projectile 对象
// TODO: 输出物理常量(带单位的 Gravity、Speed of Light)
// TODO: 输出弹射物的信息(Name、Initial Velocity、Launch Angle)
// TODO: 计算并输出最大高度(保留 2 位小数)
}
}
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
自己练习: C# 在线编译器