对于三者的关系,来彻底分解一下。
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修饰后,可以直接通过类名调用,不用再对类进行实例化。另外静态字段只能被静态方法调用,静态方法只能被静态方法调用。
【感谢龙石为本站提供数据共享平台 http://www.longshidata.com/pages/exchange.html】