const readonlyC#中用const修饰的变量和用static readonly修饰的变量有什么区别?

const readonly  时间:2022-02-23  阅读:()

C#中用const修饰的变量和用static readonly修饰的变量有什么区别?

  1. 看下面的应该能解决你的问题。记得要好评哦。。。
  2. C#中有两种常量类型,分别为readonly(运行时常量)与const(编译时常量),本文将就这两种类型的不同特性进行比较并说明各自的适用场景。
  3. 工作原理
  4. readonly为运行时常量,程序运行时进行赋值,赋值完成后便无法更改,因此也有人称其为只读变量。
  5. const为编译时常量,程序编译时将对常量值进行解析,并将所有常量引用替换为相应值。
  6. 下面声明两个常量:
  7. public static readonly int A = 2; //A为运行时常量
  8. public const int B = 3; //B为编译时常量
  9. 下面的表达式:
  10. int C = A + B;
  11. 经过编译后与下面的形式等价:
  12. int C = A + 3;
  13. 可以看到,其中的const常量B被替换成字面量3,而readonly常量A则保持引用方式。
  14. 声明及初始化
  15. readonly常量只能声明为类字段,支持实例类型或静态类型,可以在声明的同时初始化或者在构造函数中进行初始化,初始化完成后便无法更改。
  16. const常量除了可以声明为类字段之外,还可以声明为方法中的局部常量,默认为静态类型(无需用static修饰,否则将导致编译错误),但必须在声明的同时完成初始化。
  17. 数据类型支持
  18. 由于const常量在编译时将被替换为字面量,使得其取值类型受到了一定限制。const常量只能被赋予数字(整数、浮点数)、字符串以及枚举类型。下面的代码无法通过编译:
  19. public const DateTime D = DateTime.MinValue;
  20. 改成readonly就可以正常编译:
  21. public readonly DateTime D = DateTime.MinValue;
  22. 可维护性
  23. readonly以引用方式进行工作,某个常量更新后,所有引用该常量的地方均能得到更新后的值。
  24. const的情况要稍稍复杂些,特别是跨程序集调用:
  25. public class Class1
  26. {
  27. public static readonly int A = 2; //A为运行时常量
  28. public const int B = 3; //B为编译时常量
  29. }
  30. public class Class2
  31. {
  32. public static int C = Class1.A + Class1.B; //变量C的值为A、B之和
  33. }
  34. Console.WriteLine(Class2.C); //输出"5"
  35. 假设Class1与Class2位于两个不同的程序集,现在更改Class1中的常量值:
  36. public class Class1
  37. {
  38. public static readonly int A = 4; //A为运行时常量
  39. public const int B = 5; //B为编译时常量
  40. }
  41. 编译Class1并部署(注意:这时并没有重新编译Class2),再次查看变量C的值:
  42. Console.WriteLine(Class2.C); //输出"7"
  43. 结果可能有点出乎意料,让我们来仔细观察变量C的赋值表达式:
  44. public static int C = Class1.A + Class1.B;
  45. 编译后与下面的形式等价:
  46. public static int C = Class1.A + 3;
  47. 因此不管常量B的值如何变,对最终结果都不会产生影响。虽说重新编译Class2即可解决这个问题,但至少让我们看到了const可能带来的维护问题。
  48. 性能比较
  49. const直接以字面量形式参与运算,性能要略高于readonly,但对于一般应用而言,这种性能上的差别可以说是微乎其微。
  50. 适用场景
  51. 在下面两种情况下:
  52. a.取值永久不变(比如圆周率、一天包含的小时数、地球的半径等)
  53. b.对程序性能要求非常苛刻
  54. 可以使用const常量,除此之外的其他情况都应该优先采用readonly常量。

问题:

1. 私有静态成员的作用(private static 变量)

字面表示私有的,类外不能使用;静态的,全局变量。看上去很矛盾,又不能被类外使用,要全局的有什么用。问得好,类中全局也是很有意义的,例如 private static int a = 5,那么就可以保证变量a在类的初始化过程中将被优先初始化(在构造函数执行之前)。这样如果对象A的初始化需要对象B的实例,那么就可以用这种申明,以保证在类A在构造函数中能够使用类B的实例。同时private又能够保证类B的实例只能在类A中使用,起到很好的密封作用。

2. 私有最终成员作用(private final 变量)

在类构造函数完成前必须对该成员完成初始化,一旦定义不许更改;该成员只能在本类中使用。实例,子类中都不能使用。

private static final修饰的成员在申明的时就被赋值,保证在构造函数中可以被使用,一个被private static final修饰的成员通常表示其他组件的一个实例,且变量是类中的全局变量。

private final 修饰的成员在构造中被赋值,表示它是该类全局的私有成员变量,且该类的构造需要传入他们的初始值,才能完成类的初始化。

C# const和static readonly区别

const: 用const修饰符声明的成员叫常量,是在编译期初始化并嵌入到客户端程序 static readonly: 用static readonly修饰符声明的成员依然是变量,只不过具有和常量类似的使用方法:通过类进行访问、初始化后不可以修改。但与常量不同的是这种变量是在运行期初始化。

C# const和static readonly区别示例:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. namespace Example02Lib
  5. {
  6. public class Class1
  7. {
  8. public const String strConst = "Const";
  9. public static readonly String strStaticReadonly = "StaticReadonly";
  10. //public const String strConst = "Const Changed";
  11. //public static readonly String strStaticReadonly = "StaticReadonly Changed";
  12. }
  13. }

客户端代码:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using Example02Lib;
  5. namespace Example02
  6. {
  7. class Program
  8. {
  9. static void Main(string[] args)
  10. {
  11. //修改Example02中Class1的strConst初始值后,只编译Example02Lib项目
  12. //然后到资源管理器里把新编译的Example02Lib.dll拷贝Example02.exe所在的目录, 执行Example02.exe
  13. //切不可在IDE里直接调试运行因为这会重新编译整个解决方案!!
  14. //可以看到strConst的输出没有改变,而strStaticReadonly的输出已经改变
  15. //表明Const变量是在编译期初始化并嵌入到客户端程序,而StaticReadonly是在运行时初始化的
  16. Console.WriteLine("strConst : {0}", Class1.strConst);
  17. Console.WriteLine("strStaticReadonly : {0}", Class1.strStaticReadonly);
  18. Console.ReadLine();
  19. }
  20. }
  21. }

修改后的示例:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. namespace Example02Lib
  5. {
  6. public class Class1
  7. {
  8. //public const String strConst = "Const";
  9. //public static readonly String strStaticReadonly = "StaticReadonly";
  10. public const String strConst = "Const Changed";
  11. public static readonly String strStaticReadonly = "StaticReadonly Changed";
  12. }
  13. }

RAKsmart(年79元),云服务器年付套餐汇总 - 香港 美国 日本云服务器

RAKsmart 商家从原本只有专注于独立服务器后看到产品线比较单薄,后来陆续有增加站群服务器、高防服务器、VPS主机,以及现在也有在新增云服务器、裸机云服务器等等。机房也有增加到拥有洛杉矶、圣何塞、日本、韩国、中国香港等多个机房。在年前也有介绍到RAKsmart商家有提供年付129元的云服务器套餐,年后我们看到居然再次刷新年付云服务器低价格。我们看到云服务器低至年79元,如果有需要便宜云服务器的...

hostkey俄罗斯、荷兰GPU显卡服务器/免费Windows Server

Hostkey.com成立于2007年的荷兰公司,主要运营服务器出租与托管,其次是VPS、域名、域名证书,各种软件授权等。hostkey当前运作荷兰阿姆斯特丹、俄罗斯莫斯科、美国纽约等数据中心。支持Paypal,信用卡,Webmoney,以及支付宝等付款方式。禁止VPN,代理,Tor,网络诈骗,儿童色情,Spam,网络扫描,俄罗斯色情,俄罗斯电影,俄罗斯MP3,俄罗斯Trackers,以及俄罗斯法...

7月RAKsmart独立服务器和站群服务器多款促销 G口不限量更低

如果我们熟悉RAKsmart商家促销活动的应该是清楚的,每个月的活动看似基本上一致。但是有一些新品或者每个月还是有一些各自的特点的。比如七月份爆款I3-2120仅30美金、V4新品上市,活动期间5折、洛杉矶+硅谷+香港+日本站群恢复销售、G口不限流量服务器比六月份折扣力度更低。RAKsmart 商家这个月依旧还是以独立服务器和站群服务器为主。当然也包括有部分的低至1.99美元的VPS主机。第一、I...

const readonly为你推荐
createfile失败CreateFile失败,代码5拒绝访问(高分在线求助!!!)爱短信官网求助。爱短信爱聊怎么用?avc是什么格式XVID/MPEG/AVC都是什么意思啊手机软件开发工具手机app一般用什么 软件开发手机软件开发工具做安卓软件开发需要哪些工具?wow服务器状态我电脑上的魔兽服务器状态很好.但是还是玩不起来.请问可以玩了不?gas是什么意思petrol和gas的区别yui3YUI最详细的资料怎么查微信注册时间怎么查一个微信公众号的注册时间,发了多少条内容怎么查微信注册时间怎么知道微信上次登录时间
高防服务器租用选锐一 北京主机租用 免费域名空间申请 韩国vps 域名服务器上存放着internet主机的 l5520 20g硬盘 info域名 lighttpd 警告本网站 cpanel空间 秒杀预告 cdn加速原理 免费测手机号 如何建立邮箱 双线机房 独享主机 什么是web服务器 免费的域名 英雄联盟台服官网 更多