• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

C#静态常量和动态常量的区别

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

C#拥有两种不同的常量:静态常量(compile-time constants)和动态常量(runtime  constants)。它们有不同的特性,错误的使用不仅会损失效率,还可能造成错误。相比之下,静态常量在速度上会稍稍快一些,但是灵活性却比动态常量差很多。 

//静态常量(隐式是静态的)
public const int  compiletimeConstant = 1;
//动态常量
public static readonly runtimeConstant =  1;

     静态常量在编译时会将其替换为所对应的值,也就是说下面这2句话通过编译器编译后产生的IL是一样的。

//通过编译后二者会被翻译成相同的中间语言
int myNum =  compiletimeConstant;
int myNum = 1;

     动态常量的值是在运行时获得的。IL中将其标为只读常量,而不是用常量的值代替。

     静态常量只能被声明为简单的数据类型(内建的int和浮点型)、枚举或字符串。下面的程序段是通不过编译的。你不能用new关键字初始化一个静态常量,即便是对一个值类型来说。

//这样是错误的
public const DateTime myDateTime = new  DateTime(2006,9,1,0,0,0);
//这样是可以的
public static readonly DateTime  myDateTime = new DateTime(2006,9,1,0,0,0);

       只读数据也是常量的一种,它们不能在构造器初始化之后被修改。但是它同静态常量不同,它的值是在运行时才被指派的,因此就会获得更大的灵活性。动态常量可以是任意的数据类型。

       二者最大的差别在于:静态常量在编译时会将其换为对应的值,这就意味着对于不同的程序集来说,当你改变静态常量的时候需要将其重新编译,否则常量的值不会发生变化,可能引发潜在的问题,而动态常量就不会有这种情况。

     用const定义的常量(隐式是静态的),需要像访问静态成员那样去访问const定义的常量,而用对象的成员方式去访问会出编译错误。 声明的同时要设置常量值。
      从另一方面来说,如果你的确要声明一些从不改变且处处唯一的常量,例如钩子函数SetWindowsHookEx的idHook参数或序列化时的版本等,就应该使用静态常量。但是用到这样的常量的机会不多。一般来说我们应该使用灵活性更高的动态常量。

              静态常量           动态常量
 
内存消耗        无                  因为要保存常量 有消耗
 
初始化         很少的简单类型,     任意类型,可以在类构造函数中赋值
               不能new,必须在
                声明同时赋值
 
何时发挥作用  编译时进行替换      相当于类中的数据成员


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
c#(字符串方法总结)发布时间:2022-07-10
下一篇:
C#摄像头获取程序(C#源码)发布时间:2022-07-10
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap