C# Const、readonly、Static区别

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

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修饰后,可以直接通过类名调用,不用再对类进行实例化。另外静态字段只能被静态方法调用,静态方法只能被静态方法调用。

猜你喜欢

转载自blog.csdn.net/Ling_SevoL_Y/article/details/127802371