• C# Const、readonly、Static区别


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

    1. const

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

    特征:

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

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

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

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

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

    例如:

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

    2. readonly

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

    特征:

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

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

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

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

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

    例如:

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

    3.static

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

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

  • 相关阅读:
    SQL ZOO —— 6 JOIN
    测试需求平台4-Flask实现API服务入门实战
    现代检测技术课程实验编程:波特图分析仪原理仿真:一阶检测系统编程仿真
    如何找到redis中的dump.rdb文件?
    Unity UGUI的PhysicsRaycaster (物理射线检测)组件的介绍及使用
    SpringCloud: FeignClient原理解析
    RK3588平台开发系列讲解(视频篇)ffmpeg 的移植
    windows docker 容器启动报错:Ports are not available
    网址浏览历史记录怎么查?分享四个特别管用的方法!一分钟就学会!
    Go连接Redis集群并实现单例,组件go-redis
  • 原文地址:https://blog.csdn.net/Ling_SevoL_Y/article/details/127802371