首页 > 编程笔记 > C#笔记 阅读:23

C# const和readonly的用法(附带实例)

使用 C# 时,如果字段内容不想更改,可以使用 const 和 readonly 关键词:

C# const应用在类字段中

一般会将不会改变的值在编译阶段使用 const 设为常数值。

【实例 1】圆面积的计算。
Circle A = new Circle(10);
Console.WriteLine($"Area = {A.Area()}");

class Circle
{
    const double pi = 3.14159;
    double _r;

    public Circle(double r) => _r = r;
    public double Area()
    {
        return pi * _r * _r;
    }
}
执行结果为:

Area = 314.159

C# readonly应用在类字段中

如果类的字段变量内容是只读(readonly),则在创建此字段变量内容时有下列规则:
【实例 2】类内字段变量内容是 readonly 的应用。
Point3D p1 = new Point3D(1, 2, 3); // OK
Console.WriteLine($"p1: x={p1._x}, y={p1._y}, z={p1._z}");
Point3D p2 = new Point3D();
p2._x = 30;
Console.WriteLine($"p2: x={p2._x}, y={p2._y}, z={p2._z}");

public class Point3D
{
    public int _x;
    public readonly int _y = 10; // readonly设置初始值
    public readonly int _z; // readonly设置没有初始值
    public Point3D() => _z = 20;
    public Point3D(int x, int y, int z)
    {
        _x = x;
        _y = y;
        _z = z;
    }
}
执行结果为:

p1: x=1, y=2, z=3
p2: x=30, y=10, z=20


设计类时,如果要设定字段为 readonly,则在属性设定时不可以有 set 设定,也可以达到只读的目的。

【实例 3】不含 set 的设定。
User A = new User("JK Hung", "老师");
A.PrintInfo();

class User
{
    private string _name;
    private string _occupation;
    public User(string name, string occupation)
    {
        _name = name;
        _occupation = occupation;
    }
    public string Name
    {
        get { return _name; }
    }
    public string Occupation
    {
        get { return _occupation; }
    }
    public void PrintInfo()
    {
        Console.WriteLine($"{Name} 是 {Occupation}");
    }
}
执行结果

JK Hung 是 老师

上述程序第 13~16 行的 Name 属性和第 17~20 行的 Occupation 属性都是只有 get,没有 set,这表示 _name 和 _occupation 字段是 readonly 属性,因为无法更改它们的内容。

相关文章