C# Const、readonly、Static区别

本文详细解析了C#中的const、readonly和static关键字的特性及使用场景。const是编译时常量,值在编译时确定且不可修改;readonly是运行时常量,允许在运行时赋值,但一旦赋值后不可更改;static则表示静态成员,与对象无关,只有一份副本,可在类名下直接访问。const和readonly在数据类型和访问方式上有所不同,而static可以与它们结合使用,但有特定的调用限制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对于三者的关系,来彻底分解一下。

1. const

        静态常量,也称编译时常量,编译时--意味着用const定义的字段,在编译时就要确定值(也可以理解为声明时),之后无法更改。属于类型级,意思是用类名直接访问,被所有对象共享!

特征:

        a.编译时常量,编译时/声明时确定值,之后不能修改。

        b.性能比readonly稍好,灵活性差一些。

        c.静态常量,隐式被Static修饰,不能再用static重复修饰。

        d.静态常量的数据类型(内建的int和浮点型)、枚举或字符串。

        e.属于类型级,意思是用类名直接访问,被所有对象共享!

例如:

public const float test1 = 3.14f;         //正确,并且以后不能修改
public const int test2 = 2 + 5;           //正确,并且以后不能修改
public const string test3 = "APP";        //正确,并且以后不能修改
public const string test4 = GetData();    //异常,不能动态赋值、不能从配置文件赋值
public static const string test5 = "APP"; //异常,不能再次被Static修饰,const已经隐式静态
public static void Main()
{
     test2 = 5; //异常,不能被二次修改
}

2. readonly

        动态常量,也称运行时常量,运行时--意味着用readonly定义的字段,可以在运行时赋值(声明时或者构造函数内),之后无法更改。属于对象,意思是用对象实例访问,这里就和const形成对比了。

特征:

        a.动态常量的值是在运行时获得的,指的是,可以在声明时或者构造函数内赋值,(如果在构造函数内指定初始值,则必须是静态无参构造函数)。

        b.性能比const稍差,灵活性好一些。

        c.readonly可以被static修饰,组成 static readonly和const相似了。

        d.动态常量可以是任意的数据类型。

        e.属于对象级,意思是用实例对象访问。

例如:

        public readonly float test1 = 3.14f;//正确,并且以后不能修改
        public readonly int test2 = 2 + 5;//正确,并且以后不能修改
        public readonly string test3 = "APP";//正确,并且以后不能修改
        public readonly string test4 = GetData();//正确,动态赋值、可从配置文件赋值
        public static readonly string test5 = "APP";//正确,可以被Static修饰,
        static AppConst()
        {
            test5 = "cpp";//正确,可以在静态构造函数赋值
        }
        public static string GetData()
        {
            return "cpp";
        }
        public static void Main()
        {
            test5 = "cpp";//异常,只能在静态构造函数或声明时 赋值
        }

3.static

        其实static与const和readonly不是一类人,但是static经常和它们搅在一起,所有拿来区分一下。

        static 静态的,不变的,不会因实例化对象的不同而不同,所以与对象无关,静态成员只被创建一次,所以静态成员只有一份,无论对一个类创建多少个实例,它的静态成员都只有一个副本。static 可以修饰类、字段、属性、方法等。static修饰后,可以直接通过类名调用,不用再对类进行实例化。另外静态方法在使用字段时,只能调用静态字段,不能调用实例字段。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值